2013-07-15 22 views
7

我最近一直在阅读SBCL User Manual并开始想知道题目问题。很显然,一些lisp,例如clojure,禁止所有的副作用,以便他们可以很容易地并行化代码。 Common Lisp允许副作用,所以我想知道给定函数是“脏”还是“干净”的事实会影响它的编译。sbcl在优化时是否考虑函数是否有副作用?

例如,在the CMUCL compiler manual中,让优化显示了在许多情况下,使用'let'绑定新变量比使用'setq'更有效。我想我问是否有类似的功能调用。

我已经阅读了sbcl手册的相关章节,并通过了关于stackoverflow的问题,但无法找到答案。

+2

Clojure没有(不能)禁止所有的副作用。例如'(println“Hello World”)'是一个副作用。要完全禁止他们,他们或者需要1.不要用语言。 2.被一个非常强大的类型系统隔开。其他任何意味着停止问题 – jozefg

+0

谢谢,我应该做得更清楚。 – Baggers

+1

用你的问题写入sbcl-devel邮件列表。如果你向他们提出一个好的和明确的问题,我相信他们会给你一个很好的答案。 –

回答

1

short: 不是更快。有时实际上更慢。

长:

据SBCL-devel的斯塔斯Boukarev,

SBCL甚至不知道一个函数没有副作用,所以,没有。 此外,大多数时间有副作用是最优化的方式。

我知道的一个事实,即功能,如nreverse,这是破坏性的,往往比无损功能更快(在这种情况下reverse是无损版本)。他们还带着许多挫折。正如Peter Siebel所说的那样:

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

相关问题