diff --git a/lib/chibi/optional-test.sld b/lib/chibi/optional-test.sld index 9c1b56c6..f9557d60 100644 --- a/lib/chibi/optional-test.sld +++ b/lib/chibi/optional-test.sld @@ -47,6 +47,16 @@ ((opt-lambda (a (b 11) (c 12)) (list a b c)) 0)) + (test '(0 11 2) + (let ((b 1)) + ((opt-lambda (a (b 11) (c (* b 2))) + (list a b c)) + 0))) + (test '(0 11 22) + (let ((b 1)) + ((opt-lambda* (a (b 11) (c (* b 2))) + (list a b c)) + 0))) (test '(0 1 (2 3 4)) (let-optionals* '(0 1 2 3 4) ((a 10) (b 11) . c) (list a b c))) diff --git a/lib/chibi/optional.scm b/lib/chibi/optional.scm index 7168d9dc..b310d8cc 100644 --- a/lib/chibi/optional.scm +++ b/lib/chibi/optional.scm @@ -71,16 +71,26 @@ (define-syntax opt-lambda (syntax-rules () ((opt-lambda vars . body) - (opt-lambda/aux () vars . body)))) + (opt-lambda/aux let-optionals () vars . body)))) + +;;> \macro{(opt-lambda* ((var default) ... [rest]) body ...)} +;;> +;;> Variant of \scheme{opt-lambda} which binds using +;;> \scheme{let-optionals*}. + +(define-syntax opt-lambda* + (syntax-rules () + ((opt-lambda* vars . body) + (opt-lambda/aux let-optionals* () vars . body)))) (define-syntax opt-lambda/aux (syntax-rules () - ((opt-lambda/aux (args ...) ((var . default) . vars) . body) + ((opt-lambda/aux let-opt (args ...) ((var . default) . vars) . body) (lambda (args ... . o) - (let-optionals o ((var . default) . vars) . body))) - ((opt-lambda/aux (args ...) (var . vars) . body) - (opt-lambda/aux (args ... var) vars . body)) - ((opt-lambda/aux (args ...) () . body) + (let-opt o ((var . default) . vars) . body))) + ((opt-lambda/aux let-opt (args ...) (var . vars) . body) + (opt-lambda/aux let-opt (args ... var) vars . body)) + ((opt-lambda/aux let-op (args ...) () . body) (lambda (args ... . o) . body)))) @@ -95,6 +105,17 @@ ((define-opt (name . vars) . body) (define name (opt-lambda vars . body))))) +;;> \macro{(define-opt* (name (var default) ... [rest]) body ...)} +;;> +;;> Shorthand for +;;> \schemeblock{ +;;> (define name (opt-lambda* (var default) ... [rest]) body ...)} + +(define-syntax define-opt* + (syntax-rules () + ((define-opt* (name . vars) . body) + (define name (opt-lambda* vars . body))))) + (define (mem-key key ls) (and (pair? ls) (pair? (cdr ls)) diff --git a/lib/chibi/optional.sld b/lib/chibi/optional.sld index 4aa0243a..600e1024 100644 --- a/lib/chibi/optional.sld +++ b/lib/chibi/optional.sld @@ -1,7 +1,10 @@ (define-library (chibi optional) - (export let-optionals let-optionals* opt-lambda define-opt - let-keywords let-keywords* keyword-ref keyword-ref*) + (export let-optionals let-optionals* + opt-lambda opt-lambda* + define-opt define-opt* + let-keywords let-keywords* + keyword-ref keyword-ref*) (cond-expand (chibi (import (chibi))