我最近一直在阅读SBCL User Manual,并开始怀疑标题问题。 显然,一些lisps,例如clojure,禁止所有副作用,因此他们可以轻松地并行化代码。 Common Lisp允许副作用,因此我想知道给定函数是“脏”还是“干净”的事实是否会影响它的编译。
例如在the CMUCL compiler manual中,让优化显示在许多情况下如何使用'let'来绑定新变量将比使用'setq'进行修改更有效。我想我是在询问是否为函数调用做了类似的事情。
我已经阅读了sbcl手册的相关章节,并在stackoverflow上提出了问题,但找不到答案。
答案 0 :(得分:1)
<强>短:强> 不快。有时实际上更慢。
<强>长:强>
来自SBCL-devel的Stas Boukarev,
SBCL甚至不知道某个功能没有副作用,所以,不。 此外,大部分时间都有副作用是最佳的 方式。
我知道像nreverse
这样具有破坏性的函数往往比非破坏性函数更快(在这种情况下reverse
是非破坏性版本)。它们还带有许多挫折。正如Peter Siebel所说:
每个回收功能都是一个向前倾斜的加载枪。