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> 

とほほほほ。原因が分かったのは良いのですがどう対処したものやら。