参数将在 Lisp 中的函数调用期间被评估。除了宏之外,还有什么方法可以在不评估的情况下打印参数吗?
以Common Lisp为例:
(defun foo (&rest forms)
(loop for i in forms collect i))
在 REPL 顶层调用“foo”:
CL-USER> (foo (= 1 2) (< 2 3))
得到结果:
(NIL T)
有什么办法可以得到这个结果吗?:
((= 1 2) (< 2 3))
最佳答案
如果没有宏,你不能在 Scheme 或 Common Lisp 中做到这一点。当然,使用宏也很简单,所以如果它们适合您的用例,请随意使用它们。
也就是说,这个问题比您预期的要多一些。你实际上是在请求一个已经过时的旧 Lisp 中的功能,称为 fexprs . fexpr 正是您所描述的:一个函数,其操作数未经评估就传递给它。
大多数现代方言都取消了 fexprs,转而只使用宏,您可以查看 this Stack Overflow question有关原因的更多信息。要点是 fexpr 难以优化,难以推理,而且通常不如宏强大,因此它们被认为既多余又有害,因此被立即删除。
一些现代 Lisp 仍然支持 fexpr 或类似的东西,但与主导现代 Lisp 世界的相关巨头 Scheme 和 CL 相比,这些方言很少见且不常见。如果您需要这种东西,只需使用宏即可。更好的是,只需引用
参数,这样您就根本不需要任何宏。你会更明确(因此更清晰),并且你会得到相同的行为。
关于scheme - 打印函数调用的参数而不评估,不使用 "macro",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34446324/