Макросы - это функции. Они принимают код через свои аргументы и возвращают новый код. Макросы могут иметь побочные эффекты.
Ваш код печатает что-то в качестве побочного эффекта во время раскрытия макроса и возвращает NIL
(результат вызова функции FORMAT
).
(defmacro assign (name value)
(format t "assigning ~A to ~A~%" `,name `,value))
Используй это:
CL-USER 11 > (multiple-value-list (macroexpand '(assign foo bar)))
assigning FOO to BAR ; prints as a side effect
(NIL T) ; the macro expansion returns two values NIL and T
Аргументы приводить не имеет смысла. Код эквивалентен этому:
(defmacro assign (name value)
(format t "assigning ~A to ~A~%" name value))
Он по-прежнему возвращает NIL
в качестве расширения, что, вероятно, не то, что вам нужно.
Если вы хотите, чтобы макрос расширил форму до вызова format
, вам нужно вернуть этот вызов в виде списка. Здесь мы используем quasiquote
для создания списка из шаблона, заполняя два значения: name
и value
.
(defmacro assign (name value)
`(format t "assigning ~A to ~A~%" ,name ,value))
Может быть, вы хотите процитировать имя:
(defmacro assign (name value)
`(format t "assigning ~A to ~A~%" ',name ,value))
person
Rainer Joswig
schedule
15.05.2017
(format ...)
вместо ее оценки (поставьте перед ней обратную кавычку и удалите две имеющиеся у вас (которые в любом случае ничего не делают в данный момент)) . - person jkiiski   schedule 15.05.2017