2008年10月5日日曜日

letがなければlambdaを使えばいいじゃない

「letはlambdaのシンタックスシュガー」という話を聞いたので。

letのマクロによる実装 (OnLispのコードより)

(defmacro our-let (binds &body body)
  `((lambda ,(mapcar #'(lambda (x)
                         (if (consp x) (first x) x))
                     binds)
      ,@body)
    ,@(mapcar #'(lambda (x)
                  (if (consp x) (second x) nil))
              binds)))

(macroexpand '(our-let ((x 1) (y 2)) (+ x y)))
=> ((lambda (x y) (+ x y)) 1 2)

スペシャル変数も束縛可能

(list (our-let ((*features* '(:hoge1 :hoge2 :hoge3)))
        (member :hoge2 *features*))
      (member :hoge2 *features*))
=> ((:hoge2 :hoge3) nil)

0 件のコメント:

コメントを投稿