打印没有评估的函数调用参数,不使用"宏"

jar*_*ian 2 lisp scheme common-lisp

在Lisp中的函数调用期间将评估参数.除了宏之外还有什么方法可以在没有评估的情况下打印参数

以Common Lisp为例:

(defun foo (&rest forms)
  (loop for i in forms collect i))
Run Code Online (Sandbox Code Playgroud)

在REPL toplevel中调用"foo":

CL-USER> (foo (= 1 2) (< 2 3))
Run Code Online (Sandbox Code Playgroud)

得到了结果:

(NIL T)
Run Code Online (Sandbox Code Playgroud)

有没有办法得到这个结果?:

((= 1 2) (< 2 3))
Run Code Online (Sandbox Code Playgroud)

Ale*_*ing 8

没有宏,你不能在Scheme或Common Lisp中做到这一点.当然,对于宏来说它也非常简单,所以如果它们适合您的用例,请随意使用它们.

也就是说,这个问题比你预期的要多一些.你有效地要求一种已经脱离时尚的旧Lisps中出现的功能,称为fexprs.fexpr正是您所描述的:一个函数,其操作数传递给它而不进行求值.

大多数现代方言已经废除了fexprs而只支持使用宏,你可以看到这个Stack Overflow问题,以获取有关原因的更多信息.要点是,fexprs难以优化,难推理,和一般比宏不那么强大,所以他们被认为是冗余和积极有害的,被立即删除.

一些现代的Lisps仍然支持fexprs或类似的东西,但这些方言与Scheme和CL的相对巨人相比是罕见且不常见的,它们主导着现代Lisp世界.如果你需要这种东西,只需使用宏.更好的是,只是quote参数,所以你根本不需要任何宏.你会更明确(因此更清楚),你会得到相同的行为.