Domanda

Abbiamo inciampato su un problema nel nostro codice di oggi, e non poteva rispondere a questa domanda Clojure:

codice impuro fa Clojure valutare (o chiamate a codice Java) strettamente o pigramente?

Sembra che effetti collaterali + sequenze pigri possono portare a strani comportamenti.


Ecco quello che sappiamo che ha portato alla domanda:

Clojure ha sequenze pigri:

user=> (take 5 (range)) ; (range) returns an infinite list
(0 1 2 3 4)

E Clojure ha effetti collaterali e funzioni impure:

user=> (def value (println 5))
5                               ; 5 is printed out to screen
user=> value
nil                             ; 'value' is assigned nil

Inoltre, Clojure può effettuare chiamate a oggetti Java, che possono includere effetti collaterali. Tuttavia, gli effetti collaterali possono interagire male con la valutazione pigra:

user=> (def my-seq (map #(do (println %) %) (range)))
#'user/my-seq
user=> (take 5 my-seq)                               
(0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
0 1 2 3 4)

Quindi è tornato i primi 5 elementi, ma stampato il primo 31!

I assumere potrebbero verificarsi gli stessi tipi di problemi se chiamare i metodi laterali effettuando su oggetti Java. Ciò potrebbe rendere davvero difficile ragionare sul codice e capire cosa sta per succedere.


le questioni accessorie:

  • E 'fino al programmatore di guardare fuori per e prevenire tali situazioni? (Sì?)
  • Oltre sequenze, non Clojure esegue la valutazione rigorosa? (Sì?)
È stato utile?

Soluzione

pezzo seguenti del regolamento provvisorio pigro di Clojure circa 30 elementi in modo che il piccolo overhead è ulteriormente ridotto. Non è la scelta del puristi, ma una pratica. Consultare "The Joy of Clojure" per una soluzione comune per realizzare un elemento alla volta.

seguenti del regolamento provvisorio pigre non sono un abbinamento perfetto per funzioni impuri per la ragione che hai incontrato.

Clojure sarà anche valutare rigorosamente, ma con le macro le cose sono un po 'diverso. Builtins come if naturalmente stretta valutare.

Altri suggerimenti

costrutti pigri vengono valutati più o meno ogni volta che è conveniente per l'attuazione, non importa quello che è fatto riferimento in loro. Quindi, sì, è fino al programmatore di fare attenzione e la forza realizzazione di seguenti del regolamento provvisorio pigri quando necessario.

Non ho idea di che cosa si intende da una rigorosa valutazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top