allow non-optional bindings in let-optionals[*]

This commit is contained in:
Alex Shinn 2021-11-25 00:14:15 +09:00
parent 7a6aae39a0
commit 1eee928e67
3 changed files with 16 additions and 5 deletions

View file

@ -63,6 +63,12 @@
(test '(0 1 (2 3 4)) (test '(0 1 (2 3 4))
(let-optionals '(0 1 2 3 4) ((a 10) (b 11) . c) (let-optionals '(0 1 2 3 4) ((a 10) (b 11) . c)
(list a b 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 ((ls '()))
(let-optionals* ls ((a (begin (set! ls '(a b)) 'default-a)) (let-optionals* ls ((a (begin (set! ls '(a b)) 'default-a))
(b 'default-b)) (b 'default-b))

View file

@ -9,9 +9,11 @@
(define-syntax let*-to-let (define-syntax let*-to-let
(syntax-rules () (syntax-rules ()
((let*-to-let letstar ls (vars ...) ((v . d) . rest) . body) ((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 (vars ... (v tmp (tmp . d))) rest . body))
((let*-to-let letstar ls ((var tmp . d) ...) rest . body) ((let*-to-let letstar ls (vars ...) (v . rest) . body)
(letstar ls ((tmp . d) ... . rest) (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))))) (let ((var tmp) ...) . body)))))
;;> \macro{(let-optionals ls ((var default) ... [rest]) body ...)} ;;> \macro{(let-optionals ls ((var default) ... [rest]) body ...)}
@ -54,8 +56,8 @@
(define-syntax let-optionals (define-syntax let-optionals
(syntax-rules () (syntax-rules ()
((let-optionals ls ((var default) ... . rest) body ...) ((let-optionals ls (var&default ... . rest) body ...)
(let*-to-let 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 ...)} ;;> \macro{(let-optionals* ls ((var default) ... [rest]) body ...)}
;;> ;;>

View file

@ -1142,6 +1142,9 @@
(let ((var (if (pair? tmp) (car tmp) default)) (let ((var (if (pair? tmp) (car tmp) default))
(tmp2 (if (pair? tmp) (cdr tmp) '()))) (tmp2 (if (pair? tmp) (cdr tmp) '())))
(let-optionals* tmp2 rest . body))) (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-optionals* tmp tail . body)
(let ((tail tmp)) . body)))) (let ((tail tmp)) . body))))