2012-03-29 10 views
1

これは宿題に関する質問です。スキーム - この宣言を拡張しようとすると何が問題になりますか?

質問 enter image description here

私の試み(全ファイル):http://pastebin.com/TS6mByEj

あなたがlet var = exp1 in bodyを検索する場合、それは私が質問に応じて拡張する必要がある機能です。

Iは上記のサンプルコードをテストする場合、私はエラーapply-env: No binding for y

(evalの「LET X =中、x = 30 をさせ得る - (X、1) Y = - (X、2) はに - (x、y)は「)

; The following is execution log 

The-next-two-lines-shows-var-and-exp1 
(x) 
(#(struct:const-exp 30)) 

diff-exp 
#(struct:var-exp x) 
#(struct:const-exp 1) 

diff-exp 
#(struct:var-exp x) 
#(struct:const-exp 2) 

The-next-two-lines-shows-var-and-exp1 
(x y) 
(#(struct:diff-exp #(struct:var-exp x) #(struct:const-exp 1)) #(struct:diff-exp #(struct:var-exp x) #(struct:const-exp 2))) 

diff-exp 
#(struct:var-exp x) 
#(struct:var-exp y) 

私は、これは本当に長い言語ですけど、誰もが親切に正しい方向に私を導くことができれば本当にいいだろう。

ありがとうございました!


UPDATE

右私は評価し、エラーを打つ前に、新しい環境env1は彼らのこの

(#(struct:extend-env x #(struct:num-val 29) #(struct:extend-env x #(struct:num-val 30) #(struct:extend-env i #(struct:num-val 1) #(struct:extend-env v #(struct:num-val 5) #(struct:extend-env x #(struct:num-val 10) #(struct:empty-env)))))) 

#(struct:extend-env y #(struct:num-val 28) #(struct:extend-env x #(struct:num-val 30) #(struct:extend-env i #(struct:num-val 1) #(struct:extend-env v #(struct:num-val 5) #(struct:extend-env x #(struct:num-val 10) #(struct:empty-env))))))) 

ような#(struct:extend-env y #(struct:num-val 28)です。したがってcar env1の一部ではないことを除いて、評価される環境にはyが存在します。それはまだ

cdr env1であり、私のコードは、あなたが問題に指を持っている

+1

申し訳ありませんが、あなたの質問が間違っていたため、私の回答は削除されました。私の回答は役に立たなかったでしょう。 –

+0

@KshitijMehtaこれは問題ありません。あなたはまだ返事にあなたの時間がかかりました:)誰かが私にここで良い頭を与えることを願っています!ありがとう。 – CppLearner

答えて

4

.... car env1に依存しているが、あなたの言語には、いくつかの概念の問題を示唆しています。特に、env1は環境ではなく、環境のリストです。なぜmapを使用していますか?あなたは何を結果のcarを取っていますか? "let in 5"でインタープリタを実行した場合(つまり、変数バインディングがない場合)はどうなりますか?

mapのご利用とcarあなたが自動操縦でコーディングしようとしていることを私に示唆(「私はリストを持っている... mapはリストにものを行います!」)。どちらか、それともあなたが考えているのかextend-env(環境を変えます)とmapは、それを数回変異させる方法です。しかし、それは間違っています。

私のアドバイス:あなたが環境に含めるものを考えてください。新しい環境を計算するための別のヘルパー関数を作成します。簡単な再帰関数にしてください:map(まだ)のような上位ヘルパーはありません。テストケースを作成します。一旦それが働く(すなわち、テストされる)と、高次関数を使用して単純化することができるパターンに適合するかどうかを確認してください。

+0

ありがとうございます。とても役に立ちました! – CppLearner

関連する問題