チャーチ真理値を試しに実装してみればいいんじゃね?
(define t (lambda (x y) x))
(define f (lambda (x y) y))
(define if (lambda (p x y) (p x y)))
schemeは正格評価だけど、これらも一応動く。
けど、(if f (display "evaluated\n") 1)はevaluatedが出力され、1を返す式になる。
だからschemeではifやcondは手続きじゃ実装できない。
ifの中でdelayやforceをいくら使おうが無理。マクロを使う必要がある。
マクロもsyntax-rules使わないと実現できないかも?
遅延評価=非正格評価のhaskellなら、上の定義で十分。
t = \x y->x
f = \x y->y
my-if = \p x y->p x y
これで望みどおり動く。
my-if f (putStrLn "evaluated") 1も単に1を返す式になる。