В настоящее время я пишу metacircular оценщик в Схеме, следуя шагам книги SICP.Scheme letrec бесконечная окружающая среда
В упражнении я просил осуществить 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)))
Пропустить что-нибудь?
Ваш код когда-либо работал для простейших случаев, таких как '(let ((x 1)) x)'? –
Этот вопрос вводит в заблуждение. проблема в этом коде находится на гораздо более глубоком (ранее) уровне и не имеет ничего общего с letrec. –