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?)
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top