diff --git a/lib/chibi/optional-test.sld b/lib/chibi/optional-test.sld index 66d6b342..d90c6337 100644 --- a/lib/chibi/optional-test.sld +++ b/lib/chibi/optional-test.sld @@ -73,6 +73,11 @@ (let-optionals* ls ((a (begin (set! ls '(a b)) 'default-a)) (b 'default-b)) (test '(default-a default-b) (list a b)))) + (let ((ls (list 0 1 2))) + (let-optionals ls (a . b) + (set-car! (cdr ls) 3) + (test '(0 3 2) ls) + (test '(0 1 2) (cons a b)))) (test 5 (keyword-ref '(a: b: b: 5) 'b: #f)) (test 5 (keyword-ref* '(a: b: b: 5) 'b: #f)) (cond-expand diff --git a/lib/chibi/optional.scm b/lib/chibi/optional.scm index c30158c2..abbe3c15 100644 --- a/lib/chibi/optional.scm +++ b/lib/chibi/optional.scm @@ -76,7 +76,7 @@ (define-syntax opt-lambda (syntax-rules () ((opt-lambda vars . body) - (opt-lambda/aux let-optionals () vars . body)))) + (lambda args (let-optionals args vars . body))))) ;;> \macro{(opt-lambda* ((var default) ... [rest]) body ...)} ;;> @@ -86,18 +86,7 @@ (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 let-opt (args ...) ((var . default) . vars) . body) - (lambda (args ... . o) - (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)))) + (lambda args (let-optionals* args vars . body))))) ;;> \macro{(define-opt (name (var default) ... [rest]) body ...)} ;;> diff --git a/lib/chibi/optional.sld b/lib/chibi/optional.sld index 98033be0..4368042d 100644 --- a/lib/chibi/optional.sld +++ b/lib/chibi/optional.sld @@ -36,7 +36,7 @@ (var (if (pair? tmp) (car tmp) default))) (let-optionals* tmp2 rest . body))) ((let-optionals* tmp tail . body) - (let ((tail tmp)) . body)))) + (let ((tail (list-copy tmp))) . body)))) (define-syntax symbol->keyword* (syntax-rules () ((symbol->keyword* sym) diff --git a/lib/init-7.scm b/lib/init-7.scm index 9b1d662f..d6507367 100644 --- a/lib/init-7.scm +++ b/lib/init-7.scm @@ -1146,7 +1146,7 @@ (let ((var (car tmp))) (let-optionals* (cdr tmp) rest . body))) ((let-optionals* tmp tail . body) - (let ((tail tmp)) . body)))) + (let ((tail (list-copy tmp))) . body)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; exceptions