2011-01-05 2 views
0

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

и определение булевого выражения это в соответствии с вопросом ниже.

Редактировать Извините, мой вопрос заключается в том, что означает «он принимает среду» в качестве аргумента и что именно должна выполнять функция?

Оценить, например, «T ИЛИ F» и вернуть «F» ???

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

Что вы хотите сказать? Кроме того, не следует ли это помечать «домашнее задание»? – cam

+0

@ Кама, я думаю, что у нас нет метатег, нет? http://blog.stackoverflow.com/2010/08/the-death-of-meta-tags/ – dsolimano

+0

Спасибо @dsolimano. Я пропустил информационный бюллетень. – cam

ответ

2

Окружающая среда - это в основном словарь переменных имен для значений. Поэтому, учитывая окружающую среду

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

и выражение

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

Вы должны были бы заменить заданные значения из var1, var2 и var3 в выражение, а затем вычислить выражение.

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

+0

В схеме вы используете '# f' и' # t', а не 'nil' и' t', но у вас есть правильная идея. +1 –

+0

Спасибо @ Крис, я был в последнее время на CL. Я обновлю ответ. – dsolimano

0

Под «средой» они, вероятно, означают эквивалент «сферы» на других языках. Рассмотрим следующий фрагмент 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 и k. Таким образом, здесь есть три переменные: внешний j и внутренний j и k.

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

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

В вашем случае это звучит так, будто вас не спрашивают, чтобы беспокоиться о том, какие среды находятся в сфере охвата. У вас только одна среда, т. Е. Один список пар.

Звучит как честная работа, удачи!

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

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

1

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

Таким образом, вы должны для начала есть:

(define (eval expr env) 
    ...) 

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

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

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

Удачи :)

Edit:

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

+0

Как вы мне сказали, мне нужно реализовать «eval». Но мне разрешено использовать «или» и «и» правильно? я имею в виду, что упражнение не относится ни к одному из них, поэтому я предполагаю, что могу использовать их, как они есть. – pantelis

+0

@pantelis: 'и' и 'or' имеют специальные правила, например,« короткое замыкание ». Я думаю, вы могли бы сделать: '(и (eval expr1 env) (eval expr2 env))' – leppie

Смежные вопросы