Оценка в схеме - PullRequest
       3

Оценка в схеме

0 голосов
/ 05 января 2011

хорошо, у меня есть эта проблема здесь.меня попросили написать в Scheme функцию, которая принимает "среду" и выражение и возвращает значение этого выражения для привязок переменных, найденных в среде.

и определения логического значенияВыражение так в соответствии с приведенным ниже вопросом.

edit извините, мой вопрос: что значит "взять среду" в качестве аргумента и что именно должна делать функция?

вычислить, например, "T ИЛИ F" и вернуть "F" ???

"<expr> ::= <boolean>
          |<variable>
          |(not <expr>)
          |(or <expr> <expr>)
          |(and <expr> <expr>"

Ответы [ 3 ]

2 голосов
/ 05 января 2011

Среда - это словарь имен переменных в значения.Таким образом, учитывая окружение

var1 = #t
var2 = #f
var3 = #t

и выражение

(or var2 (and T (or var1 var3)))

Вам необходимо заменить указанные значения var1, var2 и var3 в выражении,и затем оцените выражение.

Ваша функция, вероятно, получит окружение в виде некой структуры Lisp, возможно, в виде alist, в качестве одного из ее параметров.

1 голос
/ 05 января 2011

Из того, что я могу определить, вас попросили реализовать eval.

Так что для начала вам нужно:

(define (eval expr env)
  ... )

, где expr может бытьлюбая из форм, которые вы упомянули и env , будет содержать определенные символы (возможно, список ассоциаций).

Первые 2 случая относительно тривиальны, третий - применение notпроцедура также должна быть простой, учитывая, что not будет в окружении (например, (list (cons 'not not))).

Но более сложная часть лежит в последних 2. Оба из них являются макросами, и потребуют некоторого расширения.Стандартные определения / расширения тех должны были быть даны вам.После раскрытия вы можете просто вызвать eval рекурсивно, чтобы оценить расширенное выражение.

Удачи:)

Редактировать:

Оба and и or расширяется до if, поэтому вам нужно будет это реализовать.

0 голосов
/ 05 января 2011

Под «средой» они, вероятно, подразумевают эквивалент «контекста» в других языках.Рассмотрим следующий фрагмент C:

if (7 < 100)
{
   int j = 2;
   if (j < 4)
   {
      int k = 7, j = 14;
      printf("k = %d, j = %d\n", k, j);
   }
}

Обратите внимание, что во внешней области видимости (отмеченной внешним набором фигурных скобок) единственной переменной является j.Во внутренней области видимости есть новые j и a k.Итак, здесь есть три переменные: внешняя j и внутренняя j и k.

Одним из способов реализации этого является определение области видимости в виде списка «сред».Когда вы вводите новый блок, вы добавляете в список другое «окружение».При поиске переменных по имени вы сначала смотрите в самой последней добавленной «среде».Если его там нет, вы перемещаетесь по списку сред к следующему и смотрите там и так далее.

Сама «среда» часто представляет собой просто список пар, сопоставляющий имена переменных со значениями.Похоже, вас просят передать такой список в вашу функцию, каждая пара дает символ для логической переменной и ее значение.Исходя из того, какие переменные в настоящее время находятся в области видимости, вы извлекаете их значения из среды и используете их в выражениях, которые вы вычисляете (в соответствии с заданной вами грамматикой выражения).

В вашем случаеЗвучит так, будто вас не просят беспокоиться о том, какие среды находятся в сфере применения.У вас есть только одно окружение, то есть один список пар.

Звучит как немало работы, удачи!

Вот одна справка, которая может помочь:

http://michaux.ca/articles/scheme-from-scratch-bootstrap-v0_9-environments

...