1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-29 19:30:36 +02:00
guile/test-suite/tests/curried-definitions.test
Jean Abou Samra 61d8dab8ea In curried definitions, move docstrings to outermost lambda
This makes the docstring attached to the curried function being defined
rather than the result of its application until a function that runs the
body is obtained, fixing
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=50068
2022-08-29 11:45:39 +02:00

132 lines
4.8 KiB
Scheme

;;;; curried-definitions.test -*- scheme -*-
;;;; Copyright (C) 2010 Free Software Foundation, Inc.
;;;;
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
;;;; License as published by the Free Software Foundation; either
;;;; version 3 of the License, or (at your option) any later version.
;;;;
;;;; This library is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;;;; Lesser General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU Lesser General Public
;;;; License along with this library; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
(define-module (test-suite test-curried-definitions)
#:use-module (test-suite lib)
#:use-module (ice-9 curried-definitions))
(with-test-prefix "define"
(pass-if "define works as usual"
(equal? 34
(primitive-eval '(let ()
(define (foo)
34)
(foo)))))
(pass-if "define works as usual (2)"
(equal? 134
(primitive-eval '(let ()
(define (foo x)
(+ x 34))
(foo 100)))))
(pass-if "currying once"
(equal? 234
(primitive-eval '(let ()
(define ((foo) x)
(+ x 34))
((foo) 200)))))
(pass-if "currying twice"
(equal? 334
(primitive-eval '(let ()
(define (((foo)) x)
(+ x 34))
(((foo)) 300)))))
(pass-if "just a value"
(equal? 444
(primitive-eval '(let ()
(define foo 444)
foo))))
(pass-if "docstring"
(equal? "Doc"
(primitive-eval '(let ()
(define (((foo a) b c) d)
"Doc"
42)
(procedure-documentation foo)))))
(pass-if "define-public"
(eqv? 6
(primitive-eval '(let ()
(define-public (((f a) b) c)
(+ a b c))
(((f 1) 2) 3)))))
;; FIXME: how to test for define-public actually making
;; a public binding?
(pass-if "define-public and docstring"
(equal? "Addition curried."
(primitive-eval '(let ()
(define-public (((f a) b) c)
"Addition curried."
(+ a b c))
(procedure-documentation f))))))
(with-test-prefix "define*"
(pass-if "define* works as usual"
(equal? 34
(primitive-eval '(let ()
(define* (foo)
34)
(foo)))))
(pass-if "define* works as usual (2)"
(equal? 134
(primitive-eval '(let ()
(define* (foo x)
(+ x 34))
(foo 100)))))
(pass-if "currying once"
(equal? 234
(primitive-eval '(let ()
(define* ((foo) x)
(+ x 34))
((foo) 200)))))
(pass-if "currying twice"
(equal? 334
(primitive-eval '(let ()
(define* (((foo)) x)
(+ x 34))
(((foo)) 300)))))
(pass-if "just a value"
(equal? 444
(primitive-eval '(let ()
(define* foo 444)
foo))))
(pass-if "docstring"
(equal? "Doc"
(primitive-eval '(let ()
(define* (((f a) b c) #:optional d)
"Doc"
42)
(procedure-documentation f)))))
(pass-if "define*-public"
(eqv? 6
(primitive-eval '(let ()
(define*-public (((f a) b) #:optional c)
(+ a b c))
(((f 1) 2) 3)))))
(pass-if "define*-public and docstring"
(equal? "Addition curried."
(primitive-eval '(let ()
(define*-public (((f a) b) #:key (c 3))
"Addition curried."
(+ a b c))
(procedure-documentation f))))))