(これは、Lisp Advent Calendar 2012の20日目の記事です。) 長いので前後編に分けます。お暇な方はどうぞ。 -*- delayとforce -*- 正格評価の言語でもクロージャがあれば遅延評価を行うことができます。計算式をクロージャに包んでしまえば、クロージャが呼び出されるまで中の式は評価されません。*1 先行評価 (+ 2 3) ;=> 5 遅延評価 (setq p (lambda () (+ 2 3))) ;=> 計算式を包んだクロージャ (funcall p) ;=> 5 遅延評価したい式をいちいちlambdaで包むのは面倒だし、lambdaだけでは「式を遅延評価させたい」という意図が伝わりません。ライブラリにしましょう。 (defmacro delay (expr) `(lambda () ,expr)) (defalias 'force 'funcall)