私は現在、SICP の本の手順に従って、Scheme で metacircular evaluator を書いています。
演習letrecでは、次のように実装するよう求められます。
(define (letrec->let exp)
(define (make-unassigned var)
(list var '*unassigned*))
(define (make-assign binding)
(list 'set! (letrec-binding-var binding)
(letrec-binding-val binding)))
(let ((orig-bindings (letrec-bindings exp)))
(make-let
(map make-unassigned
(map letrec-binding-var orig-bindings))
(sequence->exp
(append
(map make-assign orig-bindings)
(letrec-body exp))))))
ただし、次のように式を評価すると、無限ループに入ります。
(letrec
((a (lambda () 1)))
(+ 1 (a)))
私は何かが恋しいですか?