#arithmetic-expressions #oz #mozart
Вопрос:
Я пытаюсь создать функцию, которая принимает выражение и оценивает его. Выражения могут содержать следующие операции:
- Целые числа — описываются кортежем
int(N)
, гдеN
-целое число. - Сложение — описывается кортежем
add(X Y)
, где обаX
иY
являются арифметическими выражениями. - Умножение — описывается кортежем
mul(X Y)
, где обаX
иY
являются арифметическими выражениями. - Переменные — описываются кортежем
var(A)
, гдеA
атом, дающий имя переменной - Среда — описывается записью
env(a:5 b:5)
, гдеa
иb
являются переменными со значениями 5.
Например: {Eval add(var(a) mul(int(3) var(b))) env(a:5 b:5)}
. Что следует оценить по 20
.
До сих пор я реализовывал целые числа, сложение и умножение. Но я не совсем уверен, с чего начать для переменных и среды.
Мой текущий код:
fun {Eval X} case X of int(N) then N [] add(X Y) then {Eval X} {Eval Y} [] mul(X Y) then {Eval X} * {Eval Y} end end
Ответ №1:
Вам нужно получить значение переменной из среды. Это можно сделать, передав env() в качестве параметра функции Eval, чтобы получить к ней доступ изнутри.
Я решил ее за вас. Это должно быть легко понять.
fun {Eval Statements Env} case Statements of int(N) then N [] add(X Y) then {Eval X Env} {Eval Y Env} [] mul(X Y) then {Eval X Env} * {Eval Y Env} [] var(X) then Env.X end end
В качестве примечания, это практически то, как обычный интерпретатор запускает сценарий программирования. Используя стек операторов и среду для хранения сопоставлений переменных.