2013-07-15 9 views
7

Ho letto recentemente lo SBCL User Manual e ho iniziato a pensare alla domanda del titolo. Ovviamente alcune lisps, ad esempio il clojure, vietano tutti gli effetti collaterali in modo che possano facilmente parallelizzare il codice. Common Lisp consente effetti collaterali e quindi mi chiedevo se il fatto che una determinata funzione sia 'dirty' o 'clean' influisce sulla sua compilazione.Sccl considera se una funzione ha effetti collaterali durante l'ottimizzazione?

Ad esempio in the CMUCL compiler manual lasciare che le ottimizzazioni mostrino come, in molti casi, l'uso di "let" per associare una nuova variabile sia più efficiente della modifica con "setq". Suppongo che sto chiedendo se qualcosa di simile è fatto per le chiamate di funzione.

Ho letto le sezioni pertinenti del manuale di sbcl e ho riversato la domanda sullo stackoverflow ma non sono riuscito a trovare una risposta a questo.

+2

Clojure non (non può) vietare tutti gli effetti collaterali. Ad esempio '(println" Hello World ")' è un effetto collaterale. Per bandirli del tutto, o hanno bisogno di 1. Non essere nella lingua. 2. Essere separati da un sistema di tipi molto forte. Qualsiasi altra cosa significherebbe il problema di interruzione – jozefg

+0

Grazie, avrei dovuto renderlo più chiaro. – Baggers

+1

Scrivi nella mailing list di sbcl-devel con la tua domanda. Sono sicuro che ti daranno una buona risposta se gli fai una domanda buona e chiara. –

risposta

1

breve: Non più veloce. A volte effettivamente più lento.

lungo:

Secondo Stas Boukarev da SBCL-devel,

SBCL non sa nemmeno che una funzione non ha effetti collaterali, così, no. Inoltre, il più delle volte avere effetti collaterali è il modo più ottimale .

sono consapevole del fatto che le funzioni come nreverse, che sono distruttive, tendono ad essere più veloce di funzioni non distruttivi (in questo caso reverse è la versione non distruttivo). Vengono anche con molte battute d'arresto. Come ha detto Peter Siebel:

Ogni funzione di riciclaggio è una pistola carica puntata verso il basso.