Схема - Что не так с моей попыткой расширить эту декларацию? - PullRequest
1 голос
/ 29 марта 2012

Это домашнее задание.

Вопрос enter image description here

Моя попытка (весь файл): 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 ....

1 Ответ

4 голосов
/ 29 марта 2012

У вас есть проблема, но ваш язык предлагает некоторые концептуальные проблемы. В частности, env1 - это не среда, это список сред. Почему вы используете map? Что вы берете car результата? Что произойдет, если вы запустите ваш интерпретатор на "let in 5" (т. Е. Без привязки переменных)?

Использование вами map и car подсказывает мне, что вы пытаетесь кодировать на автопилоте («У меня есть список ... map работает со списками!»). Либо так, либо вы думаете, что extend-env изменяет (мутирует) среду, а map является способом ее мутации несколько раз. Но это не так.

Мой совет: подумайте, что вы хотите, чтобы окружающая среда содержала. Сделайте отдельную вспомогательную функцию для вычисления новой среды. Сделайте это простой рекурсивной функцией: никаких помощников более высокого порядка, таких как map (пока). Напишите контрольные примеры для этого. Как только вы заработаете (то есть протестируете), посмотрите, соответствует ли он шаблону, для упрощения которого вы можете использовать функцию высшего порядка.

...