mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-24 20:30:28 +02:00
primitive support for lambda*
* libguile/memoize.c (scm_m_lambda_star): Define lambda* in the pre-psyntax env, and make it memoize lambda* expressions. * libguile/eval.c (BOOT_CLOSURE_PARSE_FULL): New helper. (error_invalid_keyword, error_unrecognized_keyword): New helpers. (prepare_boot_closure_env_for_apply): Flesh out application of boot closures with "full" arity. (prepare_boot_closure_env_for_eval): Punt to prepare_boot_closure_env_for_eval for the full-arity case. * module/ice-9/eval.scm (make-fixed-closure): Rename from `closure', and just handle fixed arities, where there is no rest argument.. (make-general-closure): New helper, a procedure, that returns a closure that can take rest, optional, and keyword arguments. (eval): Adapt to call make-fixed-closure or make-general-closure as appropriate. * test-suite/tests/optargs.test ("lambda* inits"): Test the memoizer as well.
This commit is contained in:
parent
9658182d5f
commit
d8a071fc4e
4 changed files with 472 additions and 31 deletions
|
@ -1,7 +1,7 @@
|
|||
;;;; optargs.test --- test suite for optional arg processing -*- scheme -*-
|
||||
;;;; Matthias Koeppe <mkoeppe@mail.math.uni-magdeburg.de> --- June 2001
|
||||
;;;;
|
||||
;;;; Copyright (C) 2001, 2006, 2009 Free Software Foundation, Inc.
|
||||
;;;; Copyright (C) 2001, 2006, 2009, 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
|
||||
|
@ -45,11 +45,34 @@
|
|||
exc (compile 'exp #:to 'value
|
||||
#:env (current-module)))))))
|
||||
|
||||
(define-syntax c&m&e
|
||||
(syntax-rules (pass-if pass-if-exception)
|
||||
((_ (pass-if test-name exp))
|
||||
(begin (pass-if (string-append test-name " (eval)")
|
||||
(primitive-eval 'exp))
|
||||
(pass-if (string-append test-name " (memoized eval)")
|
||||
(primitive-eval (memoize-expression 'exp)))
|
||||
(pass-if (string-append test-name " (compile)")
|
||||
(compile 'exp #:to 'value #:env (current-module)))))
|
||||
((_ (pass-if-exception test-name exc exp))
|
||||
(begin (pass-if-exception (string-append test-name " (eval)")
|
||||
exc (primitive-eval 'exp))
|
||||
(pass-if-exception (string-append test-name " (memoized eval)")
|
||||
exc (primitive-eval (memoize-expression 'exp)))
|
||||
(pass-if-exception (string-append test-name " (compile)")
|
||||
exc (compile 'exp #:to 'value
|
||||
#:env (current-module)))))))
|
||||
|
||||
(define-syntax with-test-prefix/c&e
|
||||
(syntax-rules ()
|
||||
((_ section-name exp ...)
|
||||
(with-test-prefix section-name (c&e exp) ...))))
|
||||
|
||||
(define-syntax with-test-prefix/c&m&e
|
||||
(syntax-rules ()
|
||||
((_ section-name exp ...)
|
||||
(with-test-prefix section-name (c&m&e exp) ...))))
|
||||
|
||||
(with-test-prefix/c&e "optional argument processing"
|
||||
(pass-if "local defines work with optional arguments"
|
||||
(eval '(begin
|
||||
|
@ -174,12 +197,12 @@
|
|||
(equal? (f 1 2 3 #:x 'x #:z 'z)
|
||||
'(x #f z (1 2 3 #:x x #:z z))))))
|
||||
|
||||
(with-test-prefix/c&e "lambda* inits"
|
||||
(with-test-prefix/c&m&e "lambda* inits"
|
||||
(pass-if "can bind lexicals within inits"
|
||||
(begin
|
||||
(define* (qux #:optional a
|
||||
#:key (b (or a 13) #:a))
|
||||
b)
|
||||
(define qux
|
||||
(lambda* (#:optional a #:key (b (or a 13) #:a))
|
||||
b))
|
||||
#t))
|
||||
(pass-if "testing qux"
|
||||
(and (equal? (qux) 13)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue