Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с задачке на eval. 
:(
    Опции темы
luser78
Дата 21.1.2010, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.1.2010

Репутация: нет
Всего: нет



Помогите решить, не знаю с чего и начать, пожалуйста.


Опpеделите на языке ЛИСП и проверьте работу функции, пpеобpазующей инфиксную запись опеpаций выpажения в пpединфиксную и возвpащающую значение выpажения.

Hапpимеp, для списка ((-8 + 10) * (1 + 2) функция должна вернуть 6.

Указание: Для вычисления значения выражения используйте функцию EVAL.



PM MAIL   Вверх
VH_
Дата 21.1.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Код
(defun F (expr)
 (cond
  ((null expr) nil)
  ((atom expr) expr)
  ((null (cdr expr)) (car expr))
  (T
   (apply
   '(lambda (e1 e2 &rest tail)
     (if tail
      (F
       (cons
        (funcall e2 (F e1) (F (car tail)))
        (cdr tail)))
      (funcall e1 (F e2))))
    expr))))

PM MAIL   Вверх
VH_
Дата 25.1.2010, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



По просьбам радиослушателей предоставляются пояснения.
Прежде всего, выражения считаются составленными правильно, то есть по правилам записи математических выражений, но при этом приоритет операций не учитывается и должен явно обозначаться расстановкой скобок.
Выражение с инфиксной записью операций могут быть следующих разновидностей:
1) число
2) унарная операция вида (операция число)
3) последовательность операций вида (число1 операция1 число2 операция2 число3 операция3 число4 ...)
при этом на месте любого числа может быть разновидность типа 2) или 3)
Соответственно, обработка выражения expr в функции (F) происходит по нескольким вариантам:
1. Если выражение представляет собой пустой список, то возвращается nil.
2. Если выражение представляет собой атом (например, число), то возвращается его значение.
3. Если выражение представляет собой список с одним элементом, то возвращается вычисленное <с помощью той же функции (F)> значение выражения, представленного этим элементом (Примечание: это для случая, когда находятся любители заключать выражения в лишние скобки)
4. Если в выражении более одного элемента, для его вычисления вызывается безымянная функция с тремя параметрами. С первым параметром e1 связывается первый элемент выражения expr, со вторым e2 - второй элемент, с параметром tail - «остаток» выражения, то есть список из всех остальных элементов выражения.
4.1. Если «остаток» выражения tail пуст - выражение содержит унарную операцию и вычисляется применением операции e1 к значению e2, которое также предварительно подлежит вычислению <с помощью той же функции (F)>.
4.2. Если в «остатке» tail есть элементы - выражение содержит по крайней мере три элемента и операция связана с параметром e2. Эта операция применяется к <предварительно вычисленным с помощью той же функции (F)> значениям элементов e1 и первого элемента «остатка» tail, вычисленная величина присоединяется спереди к укороченному «остатку» и результат снова "направляется на вычисление" в функцию (F).
Получается как в школьной математике - если действий несколько, то они выполняются по одному слева, вместо двух чисел (или выражений в скобках) и знака операции в исходное выражение подставляется результат, и вычисления продолжаются.
Правда, функции (eval) здесь места как-то не находится.
С учетом примечания в п.3 определение функции изменяется:
Код
(defun F (expr)
 (cond
  ((null expr) nil) ; вариант 1
  ((atom expr) expr) ; вариант 2
  ((null (cdr expr)) (F (car expr))) ; вариант 3
  (T
   (apply
   '(lambda (e1 e2 &rest tail)
     (if tail
      (F ; вариант 4.2
       (cons
        (funcall e2 (F e1) (F (car tail)))
        (cdr tail)))
      (funcall e1 (F e2)))) ; вариант 4.1
    expr))))

PM MAIL   Вверх
_sg
Дата 25.4.2014, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 16.5.2007

Репутация: 2
Всего: 2



как вариант:
Код

(defun prefix (w)
  (if (atom w) w `(,(cadr w) ,(prefix (car w)) ,(prefix (caddr w)))))

> (prefix '((-8 + 10) * (1 + 2)))
(* (+ -8 10) (+ 1 2))
> (eval (prefix '((-8 + 10) * (1 + 2))))
6

--------------------
vk.com/ansicommonlisp
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.