Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Написать макрос, который принимает любое число аргументов
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
yamamoto yamamoto вне форума
Member
 
Сообщений: 35
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.05.2006
По умолчанию Написать макрос, который принимает любое число аргументов - 12.05.2008, 17:19

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

Задача:

Написать макрос, который принимает любое число аргументов и устанавливает свой первый аргумент на значение второго аргумента, второй аргумент - на значение третьего и т.д., а последний - на значение первого.

Я понял задачу следующим образом. Если после (setf a 1 b 2 c 3) выполнить (my-mac a b c), то значения переменных a, b и c должны измениться так: a --> 2, b --> 3, c --> 1. Что я и назвал круговым переприсваиванием.

Мой вариант решения ("в лоб"):

Код:
(defmacro my-mac (&rest vars)
   `(let ((lst ',vars)
            (x1 (setf x1 ,(car vars))))
           (do ()
                 ((null (cdr lst)) (setf (car lst) x1))
                 (setf (car lst) (cadr lst) lst (cdr lst)))))
Все тихо работает, но ничего не делает. Если проверить потом переменные, то они останутся при своих значениях. Заранее благодарен за помощь. С уважением, yamamoto.
Ответить с цитированием
  (#2 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 13.05.2008, 07:40

Код:
CL-USER> (macroexpand-1 '(my-mac a b c))
(LET ((LST '(A B C)) (X1 (SETF X1 A)))
  (DO ()
      ((NULL (CDR LST)) (SETF (CAR LST) X1))
    (SETF (CAR LST) (CADR LST) LST (CDR LST))))
Ваш макрос создает список из символов, переставляет в нем элементы и записывает в конец значение первой переменной. Сами переменные он не трогает!

Код:
(defmacro my-rotate (&rest vars)
  (let ((tmp (gensym)))
    `(let ((,tmp ,(first vars)))
       ,@(maplist (lambda (x)
                    (let ((x1 (first x))
                          (x2 (or (second x) tmp)))
                      `(setf ,x1 ,x2)))
                  vars))))

CL-USER> (macroexpand-1 '(my-rotate a b c))
(LET ((#:G2046 A))
  (SETF A B)
  (SETF B C)
  (SETF C #:G2046))
T
Ответить с цитированием
  (#3 (permalink)) Старый
yamamoto yamamoto вне форума
Member
 
Сообщений: 35
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.05.2006
По умолчанию 13.05.2008, 11:04

Я Вам очень благодарен за помощь. Спасибо.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать функцию от двух аргументов x и n Sve234 Вопросы начинающих программистов 0 30.01.2011 12:16
Написать функцию четырёх аргументов,формирующую список Nastya* Lisp 4 30.09.2010 11:21
Написать LISP-функцию update от трёх аргументов malvina Lisp 5 22.06.2010 22:43
Постройте макрос, который реализует форматированный вывод на экран ne_ponimaju_lisp Lisp 0 17.12.2009 16:01
Написать функцию GMA такую, что GMA L принимает значение Т Sunako Lisp 3 02.12.2009 12:38
Написать функцию аргументов L1 и L2, возвращающую Т yarus Lisp 3 13.04.2009 21:15
Неверное число аргументов функции в выражении запроса isnull Evgeniya C++ Builder 11 17.10.2008 00:07
Существует ли макрос который заменяется на имя текущей выполняемой функции k0dErr Visual C++ 17 25.12.2007 22:16
Можно ли создать макрос с неизвестным числом аргументов k0dErr Visual C++ 8 23.12.2007 23:19
Написать функцию аргументов L1 L2, возвращающую Т volonter Lisp 13 11.03.2007 16:06
Как написать макрос? Vovik5 Visual Basic 2 15.10.2005 05:00
Как разработать модуль который позволит вводить вещественное число Наталка Вопросы начинающих программистов 3 16.04.2005 22:25



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов