読者です 読者をやめる 読者になる 読者になる

let の初期値を 0 にするマクロ [Common Lisp]

let は局所変数を作るオペレータで、初期値が与えられなかった場合は nil が入る。
つまり、

(let (a (b 1) (c 2))
  (list a b c))
->(nil 1 2)

となる。
カウンタとして局所変数を多く使うようなプログラムを書いていると、初期値が nil ではなくて 0 の let が欲しくなってくる。

(let0 (a (b 1) (c 2))
  (list a b c))
->(0 1 2)

のように。
そんなときこそマクロの出番だ。

(defmacro let0 (params &body body)
  `(let ,(mapcar #'(lambda (x) (if (atom x) (list x 0) x)) params)
     ,@body))

これで上のように動く。