Lisp本積読解消: はじめてのLisp関数型プログラミング 2.2.8 マクロ関数 — #:g1

Posted 2017-02-24 16:18:21 GMT

今回は、はじめてのLisp関数型プログラミングのマクロの箇所を読む。

本書はLispで関数形関数型プログラミングを学ぶのが主なのでマクロについては3頁程でさらっと流している。

対象のLisp方言は、ISLISPか、Common Lisp。
Lispのマクロは文字レベルではなく、構文レベルであること、バッククォートでテンプレート的にマクロを書く方法、評価方法がざっと書いてある。

3頁に色々詰め込んであるので、初学者にはちょっと難しいかなと思った。
これで興味を持ったら他のもっと詳しく書いてある本で勉強するのが良いと思う。

マクロでifを定義するのに、ifを使う例があったが、そういえば、ifを使わない方法があるのを思い出した。

Henry G. Baker氏のMetacircular Semantics for Common Lisp Special Formsにあるアイデア。
※記憶で書いたらシンボルの属性の使い方が逆だった。

(setf (get 'my-if 'T) 
      (lambda (then else) 
        (declare (ignore else))
        (funcall then)))

(setf (get 'my-if 'NIL) (lambda (then else) (declare (ignore then)) (funcall else)))

(defmacro my-if (pred then &optional else) `(funcall (get 'my-if (not (null ,pred))) (lambda () ,then) (lambda () ,else)))

(defun fib (n) (my-if (< n 2) n (+ (fib (1- n)) (fib (- n 2)))))

(fib 30) → 832040


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus