遅延評価によるifの再実装

組み込みの条件式(ifやcondなど)を使わずに遅延評価を使ってifを再実装してみました。
もっと簡潔に書けそうな気がしますが、とりあえずここまで。

(define-syntax my-if
  (syntax-rules ()
    ((_ test then else)
     (let ((proc (lambda (test then else)
		   (or (and (force test) (force then))
		       (force else)))))
     (proc (delay test)
	   (delay then)
	   (delay else))))))

(define (fact n)
  (my-if (<= n 1)
	 1
	 (* n (fact (- n 1)))))

(display (fact 10))