Регистрация | Войти
Lisp — программируемый язык программирования
RSS
что-то непонятное с макросами (error while parsing arguments)
babah-yu - 17.03.2017 17:46, Сообщений - 5
набираю код :

(defmacro aa ('arg) `(setf a (lambda (x) ,arg)))
 (aa '(+ 1 x))    =>    #<FUNCTION (LAMBDA (X)) {100446071B}>
 (funcall a 5)    =>    6

почему я не могу так?:

 (setf b '(+ 1 x)) 
 (aa b)    = >     "error while parsing arguments to DEFMACRO AA:
  invalid number of elements in
    B
  to satisfy lambda list
    'ARG:
  exactly 2 expected, but got a non-list"
[#]
Правильно так:

(defmacro aa (arg) `(setf a (lambda (x) ,arg)))
(aa (+ 1 x))
а так по канонам

(defmacro aa (&body body) `(setf a (lambda (x) ,@body)))
(aa
  (print "Не будем трабовать все в один список"
  (+ 1 x)
)
flyamt - 17.03.2017 21:44
[#]
Проблема у тебя в том что закаывченое 'что-то на этапе чтения раскрывается в выражение
(quote что-то)
то есть по факту макрос  у тебя определился с двумя аргументами quote и arg в дополнительных скобках. Кстати какой у тебя лисп? Последний SBCL ведет себя умнее.
flyamt - 17.03.2017 21:57
[#] Ответ на комментарий от flyamt 17.03.2017 21:44
Закрывающую скобку в третьей строчке с print забыл :(
flyamt - 17.03.2017 22:01
[#] Ответ на комментарий от flyamt 17.03.2017 22:01
да, вижу.
Стоял sbcl 1.3.8, поставил 1.3.15.
Спасибо за разъяснения, понятно почему не работает.
А можно было-бы сохранить сложное выражение,
например:

'(sqrt
        (/
                (+ (* 5.4 (+ a 4)) (* b (+ 1.2 (* a 0.25))))
                (+ (* 5.4 (+ a 1)) (* b (+ a 2.4)))
)
)
в переменную, чтобы использовать ее пару раз
 (первый раз передаваемый в макрос, конструирующий функцию, вычисляемую по условию condition,
а затем передавая это же выражение (не набирая его второй раз) в функцию, которая преобразует его в формулу libre office (есть уже такая функция)?


В примере выше что я давал, я именно пытался сохранить выражение в переменную, и передать его.
Но пока не допер как это сделать.
babah-yu - 18.03.2017 10:16
[#] Ответ на комментарий от babah-yu 18.03.2017 10:16
Со студенческими задачами лучше на киберфорум

> А можно было-бы сохранить сложное выражение, в переменную, чтобы использовать ее пару раз
  • Можно параллельно загнать аргуменит макроса в фукцию как в твоем первом примере и одновременно присвоить его другой переменной.
  • Можно просто вычислить выражение в рантайме подставив значения переменным с помощью progv и вычислив выражение с помощью apply.
  • Нельзя и не получится использовать в теле макороса значения внешних переменых.
  • Надо понимать что макрос который делает из аргумента функцию и который делает код вычисляюший значение выражения лежащего в переменной это два разных макроса
flyamt - 18.03.2017 20:14
@2009-2013 lisper.ru