SICP 読み (359) 5.5 翻訳系
問題 5.48
昨晩のエントリに書いた「あっちじゃちゃんと動いたのに」は幻だった模様。色々と確認を取った結果、もの凄いオチでした。
;;; EC-Eval input: (compile-and-run '(define (addn n) (lambda (m) (+ n m)))) (total-pushes = 0 maximum-depth = 0) ;;; EC-Eval value: (define (addn n) (lambda (m) (+ n m)))
ここは OK が戻る場面のはずなんですが ...
で、(goto (reg val)) せずに print-result に goto してみると
;;; EC-Eval input: (compile-and-run '(define (muln n) (lambda (m) (* m n)))) (total-pushes = 0 maximum-depth = 0) ;;; EC-Eval value: (((assign val (const (define (muln n) (lambda (m) (* m n))))) . #<closure (make-assign make-assign)>) ((goto (reg continue)) . #<closure (make-goto make-goto)>)) ;;; EC-Eval input:
これは確かに define なリストが戻るな。何故だ。って quote されてるからか。(とほほほほ
gosh> (compile (cadr '(compile-and-run '(define (muln n) (lambda (m) (* m n))))) 'val 'return) ((continue) (val) ((assign val (const (define (muln n) (lambda (m) (* m n))))) (goto (reg continue)))) gosh>
こ、これはヒドい。
gosh> (quoted? (cadr '(compile-and-run '(define (muln n) (lambda (m) (* m n)))))) #t gosh>
とほほほほ。原因が分かったのは良いのですがどう対処したものやら。