scheme - 打印函数调用的参数而不评估,不使用 "macro"

标签 scheme lisp common-lisp

参数将在 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/

相关文章:

scheme - 使用抽象列表函数的列表幂集

Clojure 对比其他 Lisp

lisp - 检查适当的子集

python - 在 Common Lisp 中延迟生成质数

loops - 普通口齿不清 : recursive call from a loop

lisp - 如何从 lisp 中的函数返回控制权

set - 为什么我在 Scheme 中的 adjoin-set 过程会返回错误?

debugging - 如何在方案中调试 gimp 的 script-fu 脚本?

web-scraping - Dexador 没有 OpSSL 版本号

common-lisp - Lisp-遍历列表并替换值