2013年9月6日金曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の4(超言語的抽象)、4.1(超循環評価器)、4.1.4(評価器をプログラムとして走らせる)、問題 4.14を解いてみる。

その他参考書籍

問題 4.14

Louisのmapのシステム版を超循環評価器の基本手続きとして組み込んだ場合どうなるのか順番にみていくことに。

exp を'(map (lambda (x) x) (list 1 2))とする。

evalのcondで(application? exp)がtrueとなる。(その前までのcondの述語はfasle)

(apply (eval (operator exp) the-global-environment)
       (list-of-values (operands exp) the-global-environment))

が評価される。

(apply ((eval 'map the-global-environment)
       (list-of-values '((lambda (x) x)) (list 1 2)) the-global-environment))

環境the-global-environmentではmapは変数(variable)で、基本手続きオブジェクトの(list 'primitive map)になる。

(apply (list 'primitive map)
       (list (lambda (x) x) 
             (list 1 2)))

applyのcondで(primitive-procedure? (list 'primitive map))はtrueになる。

(apply-primitive-procedure (list 'primitive map) (list (lambda (x) x) (list 1 2)))

が評価される。

(map (list (lambda (x) x)
           (list 1 2)))

よって、Louisのように、mapのシステム版を超循環評価器の基本手続きとして組み込んでしまうと、mapの第1引数が手続きではなくリストになってしまう。

なので、Evaのように、mapの定義を入力し、それを使うテストプログラムをいくつか走らせたのは上手く動くけど、反対に、Louisのようにmapのシステム版を超循環評価器の基本手続きとして組み込むとmapは失敗してしまう。

0 コメント:

コメントを投稿