Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cond через if и условное предложение when 
:(
    Опции темы
alenka012
  Дата 17.12.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1.    С помощью макроса реализовать условную конструкцию cond через if
2.    С помощью макроса реализовать условное предложение when, оно имеет такой синтаксис:
(when условие форма1 форма2 форма3...)  - если верно условие, формы последовательно вычисляются и значение последней формы возвращается в качестве значения предложения when, иначе возвращается nil.

PM MAIL   Вверх
VH_
Дата 17.12.2009, 20:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код
(defmacro COND (&rest args)
 (if args
  (if (eval (caar args))
   (cons 'progn (cdar args))
   (cons 'COND (cdr args)))))


Это сообщение отредактировал(а) VH_ - 17.12.2009, 20:32
PM MAIL   Вверх
k0rvin
Дата 24.1.2010, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



eval'ом лучше не пользоваться в данном случае, будут проблемы с лексическим окружением, да не каждый кондишн может быть вычисленен в compile-time. правильней так:
Код

(defmacro cond2 (&rest clauses)
  (if (listp clauses)
      (let ((c (car clauses)) (cs (cdr clauses)))
        `(if ,(car c)
             (progn ,@(cdr c))
             (cond2 ,@cs)))))


when соответственно:
Код

(defmacro when2 (condition &body body)
  `(if ,condition (progn ,@body) nil))



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Pa1nk1ller
Дата 5.12.2011, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(k0rvin @ 24.1.2010,  01:34)
eval'ом лучше не пользоваться в данном случае, будут проблемы с лексическим окружением, да не каждый кондишн может быть вычисленен в compile-time. правильней так:
Код

(defmacro cond2 (&rest clauses)
  (if (listp clauses)
      (let ((c (car clauses)) (cs (cdr clauses)))
        `(if ,(car c)
             (progn ,@(cdr c))
             (cond2 ,@cs)))))


when соответственно:
Код

(defmacro when2 (condition &body body)
  `(if ,condition (progn ,@body) nil))

я что-то не соображу как этими функциями пользоваться
PM MAIL   Вверх
newbee
Дата 5.12.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата(Pa1nk1ller @  5.12.2011,  15:27 Найти цитируемый пост)
я что-то не соображу как этими функциями пользоваться 
Какими?

Код

(cond 
 ((eq 'a 'b) 1)
 ((= 1 2 ) 2)
 ((> 4 5) 3)
 (nil 4)
 (t 5))


Возвращает результат вычисления первого правого выражение, у которого соответствующее левое вычислилось не в nil. В моем случае это 5.

when работает как if, только else всегда nil, а в случае успешного прохождения условия можно выполнить неограниченное число выражений.

http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node84.html

Это сообщение отредактировал(а) newbee - 5.12.2011, 14:42


--------------------
You're face to face
With man who sold the world
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

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

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


 




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


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

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