Оценка экспрессии Oz/Моцарт

#arithmetic-expressions #oz #mozart

Вопрос:

Я пытаюсь создать функцию, которая принимает выражение и оценивает его. Выражения могут содержать следующие операции:

  1. Целые числа — описываются кортежем int(N) , где N -целое число.
  2. Сложение — описывается кортежем add(X Y) , где оба X и Y являются арифметическими выражениями.
  3. Умножение — описывается кортежем mul(X Y) , где оба X и Y являются арифметическими выражениями.
  4. Переменные — описываются кортежем var(A) , где A атом, дающий имя переменной
  5. Среда — описывается записью 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  

В качестве примечания, это практически то, как обычный интерпретатор запускает сценарий программирования. Используя стек операторов и среду для хранения сопоставлений переменных.