2

私は現在、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)))

私は何かが恋しいですか?

(完全なソース コードは GitHub にあります)。

4

1 に答える 1