我目前正在按照 SICP 书的步骤在 Scheme 中编写元循环评估器。
在练习中,我被要求实施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)))
我想念什么吗?