打印函数调用的参数而不评估,不使用 "macro"
print arguments of function call without evaluation, not using "macro"
参数将在 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 中做到这一点。当然,with 宏也很简单,所以如果它们适合您的用例,请随意使用它们。
也就是说,这个问题比您预期的要多一些。你实际上是在请求一个已经过时的老式 Lisp 中存在的功能,称为 fexprs。 fexpr 正是您所描述的:一个函数,其操作数未经评估就传递给它。
大多数现代方言都取消了 fexprs,转而只使用宏,您可以查看 this Stack Overflow question 了解更多信息。要点是 fexprs 难以优化,难以推理,而且通常不如宏强大,因此它们被认为既多余又有害,因此被立即删除。
一些现代 Lisp 仍然支持 fexprs 或类似的东西,但与主导现代 Lisp 世界的相关巨头 Scheme 和 CL 相比,这些方言很少见且不常见。如果您需要这种东西,只需使用宏即可。更好的是,只有 quote
个参数,所以你根本不需要任何宏。你会更明确(因此更清晰),你会得到相同的行为。
是;如果您不介意多一层嵌套,您可以使用名为 quote
的运算符获得结果:
(quote ((= 1 2) (< 2 3)))
-> ((1 2) (2 3))
quote
不是宏;这是一个 special operator.
参数将在 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 中做到这一点。当然,with 宏也很简单,所以如果它们适合您的用例,请随意使用它们。
也就是说,这个问题比您预期的要多一些。你实际上是在请求一个已经过时的老式 Lisp 中存在的功能,称为 fexprs。 fexpr 正是您所描述的:一个函数,其操作数未经评估就传递给它。
大多数现代方言都取消了 fexprs,转而只使用宏,您可以查看 this Stack Overflow question 了解更多信息。要点是 fexprs 难以优化,难以推理,而且通常不如宏强大,因此它们被认为既多余又有害,因此被立即删除。
一些现代 Lisp 仍然支持 fexprs 或类似的东西,但与主导现代 Lisp 世界的相关巨头 Scheme 和 CL 相比,这些方言很少见且不常见。如果您需要这种东西,只需使用宏即可。更好的是,只有 quote
个参数,所以你根本不需要任何宏。你会更明确(因此更清晰),你会得到相同的行为。
是;如果您不介意多一层嵌套,您可以使用名为 quote
的运算符获得结果:
(quote ((= 1 2) (< 2 3)))
-> ((1 2) (2 3))
quote
不是宏;这是一个 special operator.