Wie interagiert Clojures Faulheit mit Aufrufen zu Java / unreinem Code?

8

Wir sind heute auf ein Problem in unserem Code gestoßen und konnten diese Clojure-Frage nicht beantworten:

Evaluiert Clojure unreinen Code (oder Aufrufe von Java-Code) streng oder faul?

Es scheint, dass Nebenwirkungen + Lazy-Sequenzen zu merkwürdigem Verhalten führen können.

Hier ist, was wir wissen, das zu der Frage führte:

Clojure hat faule Sequenzen:

%Vor%

Und Clojure hat Nebenwirkungen und unreine Funktionen:

%Vor%

Außerdem kann Clojure Aufrufe an Java-Objekte vornehmen, die auch Nebenwirkungen enthalten können. Nebenwirkungen können jedoch schlecht mit einer faulen Bewertung interagieren:

%Vor%

Also hat es die ersten 5 Elemente zurückgegeben, aber die ersten 31 gedruckt!

Ich nehme an, dass die gleichen Arten von Problemen auftreten können, wenn ich seiteneffektive Methoden für Java-Objekte aufruft. Dies könnte es wirklich schwer machen, über Code nachzudenken und herauszufinden, was passieren wird.

Nebenfragen:

  • Ist es Aufgabe des Programmierers, auf solche Situationen zu achten und sie zu verhindern? (Ja?)
  • Neben Sequenzen, führt Clojure eine strenge Bewertung durch? (Ja?)
Matt Fenwick 19.10.2011, 16:16
quelle

2 Antworten

8

Clojures Lazy Seqs hat ungefähr 30 Gegenstände, so dass der kleine Overhead weiter reduziert wird. Es ist nicht die Wahl des Puristen, sondern eine praktische. Konsultieren Sie "Die Freude an Clojure" für eine gewöhnliche Lösung, um ein Element zur Zeit zu realisieren.

Lazy Seqs sind keine perfekte Kombination für unreine Funktionen aus dem Grund, aus dem Sie aufgetreten sind.

Clojure wird auch streng bewerten, aber mit Makros sind die Dinge ein bisschen anders. Builtins wie if werden natürlich ausgewertet.

    
progo 19.10.2011, 16:18
quelle
2

Lazy-Konstrukte werden mehr oder weniger ausgewertet, wann immer es für die Implementierung bequem ist, egal, was in ihnen referenziert wird. Also, ja, es liegt am Programmierer, vorsichtig zu sein und die Realisierung von Lazy Seqs zu erzwingen, wenn es nötig ist.

Ich habe keine Ahnung, was Sie mit strenger Bewertung meinen.

    
Joost Diepenmaat 19.10.2011 17:12
quelle