7

我最近一直在阅读SBCL 用户手册并开始想知道标题问题。显然,一些 lisp,例如 clojure,禁止所有副作用,因此它们可以轻松地并行化代码。Common Lisp 允许副作用,所以我想知道给定函数是“脏”还是“干净”的事实是否会影响它的编译。

例如,在 CMUCL 编译器手册中,让优化显示在许多情况下,使用“let”绑定新变量将比使用“setq”修改更有效。我想我在问是否对函数调用做了类似的事情。

我已经阅读了 sbcl 手册的相关部分,并在 stackoverflow 上提出了问题,但找不到答案。

4

1 回答 1

1

短: 没有更快。有时实际上更慢。

长:

根据 SBCL-devel 的 Stas Boukarev 所说,

SBCL 甚至不知道函数没有副作用,所以,不。此外,大多数时候有副作用是最理想的方式。

我知道诸如 之类的nreverse具有破坏性的函数往往比非破坏性函数更快(在这种情况下reverse是非破坏性版本)。他们也带来了许多挫折。正如彼得·西贝尔所说:

每个回收功能都是一个指向脚下的装载枪。

于 2016-01-21T23:57:27.267 回答