Это домашнее задание.
Вопрос
Моя попытка (весь файл): http://pastebin.com/TS6mByEj
Если вы ищете let var = exp1 in body
, эту функцию мне нужно расширить в соответствии с вопросом.
Когда я тестирую приведенный выше пример кода, я получаю ошибку apply-env: No binding for y
(eval "let x = 30
в пусть х = - (х, 1)
у = - (х, 2)
в - (х, у) ")
; 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)
. Таким образом, y
существует в среде, которую он будет оценивать, за исключением того, что он не является частью car env1
. Это в cdr env1
Тем не менее, мой код опирается на car env1
....