Common Lisp では
CL-USER> (let (a b c) c)
NIL
のように let で束縛する値を省略できる.
省略された変数は nil に束縛される.
しかし,Scheme にはそのような省略記法はない.
そこで,マクロを使い Common Lisp のような略記法を導入する.
次のように書く.
(define-syntax old-let let)
(define-syntax %let
(syntax-rules ()
((_ (te ...) () body ...)
(old-let (te ...)
body ...))
((_ (te ...) ((id e) be ...) body ...)
(%let (te ... (id e)) (be ...) body ...))
((_ (te ...) (id be ...) body ...)
(%let (te ... (id '())) (be ...) body ...))))
(define-syntax let
(syntax-rules ()
((_ e1 e2 ...)
(%let () e1 e2 ...))))
Common Lisp と同様に束縛する値を省略した変数は空リストに束縛されるようにしている.