LINUX.ORG.RU

написать макрос


0

0

Здравствуйте уважаемые! Не могли бы вы помочь? Ну не получается :-((( у бедной девушки.

Надо написать макрос, некий вариант setq , который берёт несколько переменных и присваивает им одновременно значение (которое тоже может вычисляться). Первый аргумент – список, в котором каждый элемент является переменной. И каждому элементу присваивается значение второго аргумента. Надо сделать с DOLIST, т. б. чтобы под (macкoexpand'ом) было (... (DOLIST (VAR '(A B C) ...) (SET VAR ...)...)

и рекурсивный вариант (... (PROGN (SETQ A ...) (SETQLIST (B C) ...) ...)

Вызов: (setqlist (a b c) (+ 1 2))

Макрос должен вернуть 3 и каждый элемент должен быть равен 3.

Помогите, пожалуйста, а?!

Вариант с dolist без сайд-эффектов (значение value вычисляется 1 раз):
(defmacro setqlist ((&rest vars) value)
  (let ((iter-name (gensym))
        (value-name (gensym)))
    `(let ((,value-name ,value))
       (dolist (,iter-name ',vars)
         (set ,iter-name ,value-name))
       ,value-name)))

Вариант с dolist с сайд-эффектами (значение value вычисляется многократно):
(defmacro setqlist ((&rest vars) value)
  (let ((iter-name (gensym)))
    `(progn
       (dolist (,iter-name ',vars)
         (set ,iter-name ,value))
       ,value)))

Рекурскивный вариант с сайд-эффектами:
(defmacro setqlist ((&rest vars) value)
  (when vars
    `(progn
       (set ',(car vars) ,value)
       (setqlist ,(cdr vars) ,value)
       ,value)))

Рекурсивный без сайд-эффектов писать лениво, можешь сама попробовать.

Sectoid ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>Бросай ты этот институт, раз такие простые задачки "не получается"

Какие ты глупости советуешь. :) Можно же найти мальчика, который решит такие простые задачки. Что-то я не припомню, чтобы у нас девушки, когда я учился в Бауманке, не прибегали к помощи однокурсников. :)

P.S. Автору: А где это такие задания выдают, интересно?

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

> Можно же найти мальчика, который решит такие простые задачки.

Как локальная оптимизация это прокатит. Правда мне не понятно, зачем тратить 5 лет в институте, если по выходе из него не сможешь даже такие задачи решать? Может стоит чему-то все же научиться, чтобы потом деньги зарабатывать?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

> Как локальная оптимизация это прокатит. Правда мне не понятно, зачем тратить 5 лет в институте, если по выходе из него не сможешь даже такие задачи решать? Может стоит чему-то все же научиться, чтобы потом деньги зарабатывать?

Порвало. Неужели ты думаешь, что они поступают, чтобы потом деньги зарабатывать?

anonymous
()
Ответ на: комментарий от anonymous

наивный чукотский юноша, лол

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.