2013-07-15 18 views
7

Niedawno czytałem numer SBCL User Manual i zacząłem zastanawiać się nad tytułem pytania. Oczywiście niektóre sepsy, na przykład clojure, zakazują wszystkich efektów ubocznych, aby mogły z łatwością łączyć kod. Common Lisp pozwala na efekty uboczne, więc zastanawiałem się, czy fakt, że dana funkcja jest "brudna" czy "czysta", wpływa na jej kompilację.Czy sbcl rozważyć, czy funkcja ma skutki uboczne podczas optymalizacji?

Na przykład w pozwalają optymalizacje pokazać, jak w wielu przypadkach użycie "niech" do wiązania nowej zmiennej będzie bardziej efektywne niż modyfikowanie za pomocą "setq". Chyba pytam, czy coś podobnego zrobiono dla wywołania funkcji.

Przeczytałem odpowiednie sekcje podręcznika sbcl i przelewałem przez pytanie na stackoverflow, ale nie mogłem znaleźć odpowiedzi na to.

+2

Clojure nie może (nie może) zakazać wszystkich skutków ubocznych. Na przykład '(println" Hello World ")' jest efektem ubocznym. Aby całkowicie je zbanować, muszą albo 1. Nie być w tym języku. 2. Rozdziel się bardzo silnym systemem typów. Coś innego oznaczałoby problem z zatrzymaniem. – jozefg

+0

Dzięki, powinienem był to wyjaśnić. – Baggers

+1

Wpisz swoje pytanie na listę dyskusyjną sbcl-devel. Jestem pewien, że dadzą ci dobrą odpowiedź, jeśli zadasz im dobre i jasne pytanie. –

Odpowiedz

1

krótko: Nie szybciej. Czasami wolniej.

długa:

Według Stas Boukarev od SBCL-devel,

SBCL nawet nie wie, że funkcja nie ma skutków ubocznych, więc nie. Poza tym, większość czasu mającego skutki uboczne jest najbardziej optymalnym sposobem na .

Zdaję sobie sprawę z faktu, że funkcje takie jak nreverse, które są destrukcyjne, wydają się być szybsza niż niszczących funkcji (w tym przypadku reverse jest wersja nieniszczące). Są one również dostarczane z pewnymi komplikacjami . Jak ujął to Peter Siebel:

Każda funkcja recyklingu to naładowany pistolet skierowany do przodu.

Powiązane problemy