【发布时间】:2017-03-28 12:26:51
【问题描述】:
我正在尝试在 LISP 中使用具有两种形式的宏,它评估两种形式但总是返回形式 2 的结果。下面是我正在使用的代码 -
(defmacro testmac (x body) (prog2 x body))
当使用以下形式执行宏时,它可以正常工作,并且总是返回 5,即第二种形式。
(testmac (- 10 6) (/ 10 2))
但是,当我尝试使用以下形式执行宏时,它会返回错误。
(testmac (print a) (print b))
以下是我得到的错误 -
debugger invoked on a UNBOUND-VARIABLE: The variable B is unbound.
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SB-INT:SIMPLE-EVAL-IN-LEXENV B #<NULL-LEXENV>)
为什么会出现这个错误,我该如何使用宏来完成这项工作?
附:我不能用defun 需要用宏来执行(testmac (print a) (print b))
【问题讨论】:
-
欢迎使用 StackOverflow!这是一个结构良好的第一个问题。但是......请写“Lisp”,不带大写;)
-
@Ealhad。当然,感谢您的建议。
-
不客气!祝你好运,黑客愉快。
-
@Rainer @ Ealhad,感谢大家的反馈和建议。根据你们所指出的,我正在执行代码为 (testmac (print 'a) (print 'b)) ,它返回 B 并且没有错误。它解决了我试图解决的原始问题,即使用宏和 prog2 来评估两种形式(@rainer,我知道这是不可取的)并返回第二种形式的结果。我希望这是正确的解决方案,而不是解决方法。谢谢。
标签: lisp common-lisp clisp