diff --git a/lib/chibi/optional-test.sld b/lib/chibi/optional-test.sld index 95b1e6ed..66d6b342 100644 --- a/lib/chibi/optional-test.sld +++ b/lib/chibi/optional-test.sld @@ -63,6 +63,12 @@ (test '(0 1 (2 3 4)) (let-optionals '(0 1 2 3 4) ((a 10) (b 11) . c) (list a b c))) + (test '(0 1 (2 3 4)) + (let-optionals* '(0 1 2 3 4) (a (b 11) . c) + (list a b c))) + (test '(0 1 (2 3 4)) + (let-optionals '(0 1 2 3 4) (a (b 11) . c) + (list a b c))) (let ((ls '())) (let-optionals* ls ((a (begin (set! ls '(a b)) 'default-a)) (b 'default-b)) diff --git a/lib/chibi/optional.scm b/lib/chibi/optional.scm index 97dc86f7..c30158c2 100644 --- a/lib/chibi/optional.scm +++ b/lib/chibi/optional.scm @@ -9,9 +9,11 @@ (define-syntax let*-to-let (syntax-rules () ((let*-to-let letstar ls (vars ...) ((v . d) . rest) . body) - (let*-to-let letstar ls (vars ... (v tmp . d)) rest . body)) - ((let*-to-let letstar ls ((var tmp . d) ...) rest . body) - (letstar ls ((tmp . d) ... . rest) + (let*-to-let letstar ls (vars ... (v tmp (tmp . d))) rest . body)) + ((let*-to-let letstar ls (vars ...) (v . rest) . body) + (let*-to-let letstar ls (vars ... (v tmp tmp)) rest . body)) + ((let*-to-let letstar ls ((var tmp bind) ...) rest . body) + (letstar ls (bind ... . rest) (let ((var tmp) ...) . body))))) ;;> \macro{(let-optionals ls ((var default) ... [rest]) body ...)} @@ -54,8 +56,8 @@ (define-syntax let-optionals (syntax-rules () - ((let-optionals ls ((var default) ... . rest) body ...) - (let*-to-let let-optionals* ls () ((var default) ... . rest) body ...)))) + ((let-optionals ls (var&default ... . rest) body ...) + (let*-to-let let-optionals* ls () (var&default ... . rest) body ...)))) ;;> \macro{(let-optionals* ls ((var default) ... [rest]) body ...)} ;;> diff --git a/lib/init-7.scm b/lib/init-7.scm index 3fd8d3b2..9b1d662f 100644 --- a/lib/init-7.scm +++ b/lib/init-7.scm @@ -1142,6 +1142,9 @@ (let ((var (if (pair? tmp) (car tmp) default)) (tmp2 (if (pair? tmp) (cdr tmp) '()))) (let-optionals* tmp2 rest . body))) + ((let-optionals* tmp (var . rest) . body) + (let ((var (car tmp))) + (let-optionals* (cdr tmp) rest . body))) ((let-optionals* tmp tail . body) (let ((tail tmp)) . body))))