我正在学习普通的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)))

09-10 03:02
查看更多