我正在学习普通的Lisp的宏系统,突然发现一个问题
(defun hello () (format t "hello ~%"))
(defun world () (format t "world ~%"))
(defmacro call-2-func (func1 func2)
`(,func1)
`(,func2))
(macroexpand-1 '(call-2-func hello world))
(WORLD)
T
好。为什么我不能只从一个宏生成2个LoC我该怎么办?(progn在更复杂的情况下不会工作…)
最佳答案
宏只需要返回一个调用这两个函数的窗体。
相反,您将生成两个表单(只使用最后一个表单)
尝试:
(defmacro call-2-func (func1 func2)
`(progn (,func1) (,func2)))
或者,如果不希望仅限于两个函数:
(defmacro call-funcs (&rest funcs)
`(progn ,@(mapcar #'list funcs)))