SICP 読み (163) 4.1.4 評価器をプログラムとして走らせる

問題 4.14

最初、primitive-procedures に map を仕込んで以下の試験をした所、試験にパス。何故に動くのだ、と言いつつ昨晩は意識を失なっております。

      (assert-equal '(a d g) (map car (list (list 'a 'b 'c)
					    (list 'd 'e 'f)
					    (list 'g 'h 'i))))
      (assert-equal '(6 8 10 12) (map (lambda (x y) (+ x y)) 
				      '(1 2 3 4) 
				      '(5 6 7 8)))

朝イチで user-print の定義を見つつ、なんとなく答えに思い至る。
で、上記の試験を見て「わしゃアホか」と。(とほほ

理由

上記のように gauche の基本手続きな map を組み込んだ場合、その中でどんな処理が行なわれているのかは分かりませんが、評価機の中での基本手続きなリストが map の中で理解不能だと思われます。例えば

(eval (map car '((a b c) (d e f) (g h i))) env)

がどう評価されるか、というと上記は application と判断されるので以下。

(apply (eval map env) (list-of-values (car '((a b c) (d e f) (g h i)))))

で、(eval map env) は ('primitive carの手続きオブジェクト) というリストを戻します。gauche な map はこのリストを手続きとして理解できない、という事が理由で良いのかな。逆に評価器の中で定義した map であれば上記のリストは基本手続きである事が分かるので正常に評価できる、という事か。