2013-07-15 64 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所說的那樣:

每個回收功能都是一個加載的槍指向下方。

相關問題