Wie interagiert die Faulheit von Clojure mit Anrufen an Java/unreiner Code?
-
27-10-2019 - |
Frage
Wir sind heute auf ein Problem in unserem Code gestoßen und konnten diese Clojure -Frage nicht beantworten:
Bewertet Clojure den unreinen Code (oder Anrufe nach Java -Code) streng oder träge?
Es scheint, dass Nebenwirkungen + faule Sequenzen zu seltsamem Verhalten führen können.
Folgendes wissen wir, was zur Frage geführt hat:
Clojure hat faule Sequenzen:
user=> (take 5 (range)) ; (range) returns an infinite list
(0 1 2 3 4)
Und Clojure hat Nebenwirkungen und unreine Funktionen:
user=> (def value (println 5))
5 ; 5 is printed out to screen
user=> value
nil ; 'value' is assigned nil
Außerdem kann Clojure an Java-Objekte Anrufe tätigen, die Nebenwirkungen enthalten können. Nebenwirkungen können jedoch schlecht mit der faulen Bewertung interagieren:
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)
Also gab es die ersten 5 Elemente zurück, druckte aber die ersten 31!
Ich nehme an, dass die gleichen Probleme auftreten können, wenn sie Nebeneffektmethoden auf Java-Objekten aufrufen. Dies könnte es sehr schwierig machen, über Code zu argumentieren und herauszufinden, was passieren wird.
Nebenfragen:
- Ist es an dem Programmierer geeignet, solche Situationen zu achten und diese zu verhindern? (Ja?)
- Führt Clojure neben Sequenzen eine strenge Bewertung durch? (Ja?)
Lösung
Clojure's Lazy SEQS -Teile, so dass der kleine Overhead weiter reduziert wird. Es ist nicht die Wahl des Puristen, sondern eine praktische. Wenden Sie sich an "The Joy of Clojure", um eine gewöhnliche Lösung zu erzielen, um ein Element zur Zeit zu realisieren.
Faule SEQs sind nicht perfekt zu unreinen Funktionen, aus dem Grund, warum Sie begegnet sind.
Clojure wird auch streng bewerten, aber mit Makros sind die Dinge etwas anders. Baustäte wie if
wird natürlich die Bewertung halten.
Andere Tipps
Faule Konstrukte werden mehr oder weniger bewertet, wenn die Implementierung unabhängig davon, was in ihnen verwiesen wird, zweckmäßig ist. Ja, es liegt an dem Programmierer, vorsichtig zu sein und bei Bedarf die Realisierung fauler SEQs zu erzwingen.
Ich habe keine Ahnung, was Sie unter strenger Bewertung meinen.