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