Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Electroflower
Shiningemerald
309 / 102 / 22
Регистрация: 05.01.2012
Сообщений: 617
Записей в блоге: 1
#1

Милая задачка на макросы) - Lisp

21.01.2012, 15:23. Просмотров 1559. Ответов 12
Метки нет (Все метки)

Ребят, если кто знает, как такое решить, отзовитесь, плиз
Определите в виде макроса логическое действие ИЛИ для переменного количества аргументов (ИЛИ х1 х2 …хn) так, чтобы вычисления заканчивались, когда найдено xi, значение которого не NIL.
благодарна.
http://www.cyberforum.ru/lisp/thread1089147.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2012, 15:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Милая задачка на макросы) (Lisp):

Макросы
Доброго времени суток =) Такой вопрос. Как реализуется макросы в Emacs Lisp?...

Макросы
;3. Вставить obj после n-ых элементов каждого подсписка. (defun insert (v n...

Макросы
Разработать синтаксическию форму с помощью макроса: (Если число (выражение при...

Макросы в Lisp
Помогите пожалуйста!!! При описании функционала можно использовать средства...

Макросы и функционалы
Задачу решить с использованием макросов и функционалов. Программа должна быть...

12
bokunopico
306 / 261 / 5
Регистрация: 03.04.2011
Сообщений: 456
21.01.2012, 16:01 #2
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defmacro or1 (&rest forms)
  (cond ((endp forms) nil)
        ((endp (rest forms))
         ;; Preserve non-toplevelness of the form!
         `(the t ,(first forms)))
        (t
         (let ((n-result (gensym)))
           `(let ((,n-result ,(first forms)))
              (if ,n-result
                  ,n-result
                  (or1 ,@(rest forms))))))))
В SBCL или каких-нибудь других реализациях несложно поглядеть.
0
Electroflower
Shiningemerald
309 / 102 / 22
Регистрация: 05.01.2012
Сообщений: 617
Записей в блоге: 1
21.01.2012, 16:16  [ТС] #3
жалуется
Lisp
1
error: unbound function - THE
0
bokunopico
306 / 261 / 5
Регистрация: 03.04.2011
Сообщений: 456
21.01.2012, 16:53 #4
А в какой среде это происходит?
Можно таким способом сделать:
(or x y z) --> (cond (x) (y) (z))
Lisp
1
2
(defmacro or2 (&rest forms)
  `(cond ,@(loop for i in forms collecting `(,i))))
Добавлено через 16 минут
Или попытаться заменить на вариант без the, например, поменять:
Lisp
1
`(the t ,(first forms)))
на
Lisp
1
`(,@(first forms)))
0
transformator.t
defun
596 / 610 / 44
Регистрация: 30.04.2011
Сообщений: 696
21.01.2012, 17:18 #5
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defmacro f (&rest val)
             (let* ((stat (gensym))
                    (first (car val))
                    (tail (cdr val)))
               (if (null val) ()
                   `(let ((,stat ,first))
                      (if ,stat ,stat
                          (f ,@tail))))))
 
CL-USER> (f (numberp 'a) (consp 'b) 4 5)
4
CL-USER> (or (numberp 'a) (consp 'b) 4 5)
4
Добавлено через 10 минут
http://www.youtube.com/watch?v=gzXQQ38g00E
0
bokunopico
306 / 261 / 5
Регистрация: 03.04.2011
Сообщений: 456
21.01.2012, 17:18 #6
Lisp
1
2
3
4
5
6
CL-USER> (macroexpand-1 '(f (= 1 1)))
(LET ((#:G1195 (= 1 1)))
  (IF #:G1195
      #:G1195
      (F)))
T
(if x x nil)
0
transformator.t
defun
596 / 610 / 44
Регистрация: 30.04.2011
Сообщений: 696
21.01.2012, 17:21 #7
теперь мне понятно, откуда взялось the, а я думал, bokunopico, ты сам решаешь)
и что ты хотел сказать своим сообщением?
это что, не верно? ->
Lisp
1
2
3
4
5
6
CL-USER> (f (= 1 1))
T
CL-USER> (f (= 1 1) 2)
T
CL-USER> (f (/= 1 1) 2)
2
0
bokunopico
306 / 261 / 5
Регистрация: 03.04.2011
Сообщений: 456
21.01.2012, 17:26 #8
Блин, с моим loop также.

Добавлено через 39 секунд
Цитата Сообщение от bokunopico Посмотреть сообщение
В SBCL или каких-нибудь других реализациях несложно поглядеть.
Конечно, сам.

Добавлено через 4 минуты
(if x x nil) - то же самое, что просто x.
0
transformator.t
defun
596 / 610 / 44
Регистрация: 30.04.2011
Сообщений: 696
21.01.2012, 17:27 #9
а ну объясни мне вот это - http://www.cyberforum.ru/post2411802.html
я не понял, что ты хотел этим сказать?

опять ты в пролёте)
а я люблю летать - во сне))
0
bokunopico
306 / 261 / 5
Регистрация: 03.04.2011
Сообщений: 456
21.01.2012, 17:31 #10
А почему я в пролёте-то?
0
transformator.t
defun
596 / 610 / 44
Регистрация: 30.04.2011
Сообщений: 696
21.01.2012, 17:33 #11
да пошутил я)) не бери в голову)

на этом месте был текст, который прочитали те, кому это было надо, а было это надо тем, кто прочитал тот текст)))
0
Electroflower
Shiningemerald
309 / 102 / 22
Регистрация: 05.01.2012
Сообщений: 617
Записей в блоге: 1
21.01.2012, 17:38  [ТС] #12
ай, спасибооо
0
bokunopico
306 / 261 / 5
Регистрация: 03.04.2011
Сообщений: 456
21.01.2012, 17:58 #13
Ну, судя по HyperSpec: http://www.lispworks.com/documentation/HyperSpec/Body/s_the.htm#the и если я правильно понял, то вычисляется форма, а затем проверяется, соответствует ли результат t (или integer, или другому типу). Но поскольку числа, строки, непустые списки трактуются, как не nil, то я заменил на вариант с unquote-splicing (,@). Ошибка, нет?

Добавлено через 13 минут
WAIT, OH SHI~
Да, теперь точно пролетел.
0
21.01.2012, 17:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2012, 17:58
Привет! Вот еще темы с решениями:

Макросы и функционалы
Выполняя эту задачу надо составить, используя макросы и функции высших порядков...

Макросы и функционалы
В число специализированных вариантов работы включить следующее: Выполнения...

Макросы и функционалы
Используя макросы и функции высших порядков (функционалы), составить программу,...

Функционалы и макросы
Помогите на Lisp с помощью функционалов и (или) макросов создать новую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru