Lisp 用于多行代码的宏

Lisp 用于多行代码的宏,lisp,common-lisp,Lisp,Common Lisp,我正在学习CommonLisp的宏系统,突然发现了一个问题 (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?我怎

我正在学习CommonLisp的宏系统,突然发现了一个问题

(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-funcs (&rest funcs)
  `(progn ,@(mapcar #'list funcs)))

上面的内容似乎不清楚,所以让我补充一下。。。是的,您可以从宏返回2行代码,但请记住函数和宏通常只返回1个值。您可以在函数中计算多个值,但它只返回最后一个值。下面的函数只返回值-2(它仍然计算值-1,它对值-1不做任何处理)

如果要返回2个值,可以将它们包装在列表(或其他结构)中,也可以使用#值返回多个值。

在这种情况下,宏只能返回一条语句,除非在列表中包装多个值或使用#值。它返回的也必须是正确的lisp代码,通常是通过PROGN完成的

(defmacro call-2-func (func1 func2) `(PROGN (,func1) (,func2)))
如果你用

(defmacro call-2-func (func1 func2) `(,func1) `(,func2))
然后宏计算2个值,但只返回最后一个值。(正如您在上面的宏扩展中所看到的)

使用defun可以很容易地看到这一点,它计算2个值,但只返回最后一个值

(defun myname () 1 2)
使用值有点奇怪

(defmacro tttt () '(values (one) (one)))
(tttt)
1
1

嗨,迈克,你能举个例子说明progn在哪里不起作用吗。到目前为止,我还没有找到一种progn或拼接组合无法解决的情况!Cheers@Baggers我重新设计了我的作品,现在就可以了。。这是我的错误:-)请记住,在Lisp中没有LOC源代码。我们有源表单,它们实际上是数据。宏不返回由行组成的文本,而是返回形成表达式的Lisp数据。宏必须返回一个表达式作为数据。
(defun myname () 1 2)
(defmacro tttt () '(values (one) (one)))
(tttt)
1
1