SICP 読み (374) 5.5 翻訳系

うーん。休みの日は色々な意味で微妙。早くオワらせたい気持とは裏腹にこの数日のエントリを見るに転んで起きて、であんまり前に進んでないよな、と。
なんと言えばよいか分かりませんが微妙にヘコむ。

問題 5.50

なんとなく

((primitive #<subr +>) 1 2)

の (primitive #) を eval して評価器が NG 出してるように見えるな。で、grep してみたら

$ grep Unknown objectCode.txt
(assign val (const Unknown expression type -- EVAL))
(assign val (const Unknown procedure type -- APPLY))
$

上記の命令に " で囲んで再度 (+ 1 2) を評価したら

;;; M-Eval input:
(+ 1 1)
*** ERROR: Unknown procedure type -- APPLY #<subr +>
Stack Trace:

との事。何故に、と言いつつこれまでのドサクサで apply-in-underlying-scheme とか apply の定義を eval より下にしている事を確認。修正後の挙動が以下

;;; M-Eval input:
(+ 1 2)
*** ERROR: invalid application: ((primitive #<subr +>) 1 2)

うーん何だこれは、と言いつつ trace-on すれば良いコトに気づく。以下が出力

((entry1371 1) assign env (op compiled-procedure-env) (reg proc))
((entry1371 2) assign env (op extend-environment) (const (proc args)) (reg argl) (reg env))
((entry1371 3) assign proc (op lookup-variable-value) (const apply-in-underlying-scheme) (reg env))
((entry1371 4) save continue)
((entry1371 5) save proc)
((entry1371 6) assign val (op lookup-variable-value) (const args) (reg env))
((entry1371 7) assign argl (op list) (reg val))
((entry1371 8) save argl)
((entry1371 9) assign proc (op lookup-variable-value) (const primitive-implementation) (reg env))
((entry1371 10) assign val (op lookup-variable-value) (const proc) (reg env))
((entry1371 11) assign argl (op list) (reg val))
((entry1371 12) test (op primitive-procedure?) (reg proc))
((entry1371 13) branch (label primitive-branch1373))
((compiled-branch1374 1) assign continue (label after-call1375))
((compiled-branch1374 2) assign val (op compiled-procedure-entry) (reg proc))
((compiled-branch1374 3) goto (reg val))
((entry1243 1) assign env (op compiled-procedure-env) (reg proc))
((entry1243 2) assign env (op extend-environment) (const (proc)) (reg argl) (reg env))
((entry1243 3) assign proc (op lookup-variable-value) (const cadr) (reg env))
((entry1243 4) assign val (op lookup-variable-value) (const proc) (reg env))
((entry1243 5) assign argl (op list) (reg val))
((entry1243 6) test (op primitive-procedure?) (reg proc))
((entry1243 7) branch (label primitive-branch1245))
((primitive-branch1245 1) assign val (op apply-primitive-procedure) (reg proc) (reg argl))
((primitive-branch1245 2) goto (reg continue))
((after-call1375 1) restore argl)
((after-call1375 2) assign argl (op cons) (reg val) (reg argl))
((after-call1375 3) restore proc)
((after-call1375 4) restore continue)
((after-call1375 5) test (op primitive-procedure?) (reg proc))
((after-call1375 6) branch (label primitive-branch1376))
((primitive-branch1376 1) assign val (op apply-primitive-procedure) (reg proc) (reg argl))

このあたりになりましょうか

         (apply-primitive-procedure procedure arguments))

から

(define (apply-primitive-procedure proc args)
  (apply-in-underlying-scheme
;  (apply
   (primitive-implementation proc) args))

らへん?? なんかそれ以前って感じがするなぁ。いや、正に直上の手続きらへんな模様。トレイスを見るには

(apply + '(1 2))

に見えるんだけど。

*** ERROR: invalid application: ((primitive #<subr +>) 1 2)

というのがカギなのか。なんか酔っ払いがアバレながら前に行ったり後に行ったりな状態なんですが、ある意味タレ流しでスミマセン。(とほほほ
# って解決してないのに