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))
(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))

View file

@ -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 ...)}
;;>

View file

@ -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))))