開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(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.6(内部定義)、問題 4.17を解いてみる。
その他参考書籍
問題 4.17
定義を逐次的に解釈する時の環境の構造化の実際の環境図。

定義を吐き出した場合に構造化される実際の環境図。

変換後のプログラムである後者に余計なフレームがあるのは、letを利用すると、そこで手続きが実行されることになり((let ((<var> <exp>)) <body>)は((lambda (<var>) <body>) <exp>)のもう一つの構文)、また新たなフレームが必要になるから。
環境構造のこの違いが正しいプログラムの小行動に違いを生じない理由は、>e3>を評価される時の変数u、vの値に違いがないから。
養鶏なフレームを構成せずに、解釈系が内部定義の「同時」有効範囲を規則を実装するには、全ての変数おその値の式を評価する前に作るのを、letではなくdefineを使ってlambdaを使わないようにして、変数u、vに値'*unassigned*を定義するように設計すればいい。
コード(BBEdit)
sample.scm
(lambda <vars> (define u '*unassigned*) (define v '*unassigned*) (set! u <e1>) (set! v <e2>) <e3>)
0 コメント:
コメントを投稿