sbcl是否考虑优化时函数是否有副作用?

时间:2013-07-15 09:19:56

标签: common-lisp sbcl

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

例如在the CMUCL compiler manual中,让优化显示在许多情况下如何使用'let'来绑定新变量将比使用'setq'进行修改更有效。我想我是在询问是否为函数调用做了类似的事情。

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

1 个答案:

答案 0 :(得分:1)

<强>短: 不快。有时实际上更慢。

<强>长:

来自SBCL-devel的Stas Boukarev,

  

SBCL甚至不知道某个功能没有副作用,所以,不。   此外,大部分时间都有副作用是最佳的   方式。

我知道像nreverse这样具有破坏性的函数往往比非破坏性函数更快(在这种情况下reverse是非破坏性版本)。它们还带有许多挫折。正如Peter Siebel所说:

  

每个回收功能都是一个向前倾斜的加载枪。