2016-11-11 5 views
1

Ich habe zwei Code-Snippets, von denen ich annehme, dass beide zu Alarmen führen. Die erste führt jedoch zu keiner Zeit, während die zweite die Warnungen ausgibt.Clojurescript-Kartenfunktion verhält sich unerwartet

Diese geringfügige Änderung wird wie erwartet gedruckt (Null) und das Alert-Problem wird behoben. Die Frage ist WARUM?

Eine andere seltsame Beobachtung ist, dass das erste Snippet von einem Browser-Repl arbeitet, aber nicht, wenn in Code eingegeben.

Ist die Kartenfunktion Nebenwirkung frei, aber Druck ist nicht? Vielleicht eine Kerncode-Optimierung, von der ich nichts weiß?

Work-Arounds und Antworten werden beide geschätzt. Wenn Sie weitere Informationen benötigen, lassen Sie es mich bitte in einem Kommentar wissen.

[org.clojure/clojurescript "1.8.51"]

BOOT_CLOJURE_VERSION = 1.7.0

BOOT_VERSION = 2.5.5

java version "1.8.0_101"

Beschreibung : Ubuntu 14.04.4 LTS

+0

Mögliche Duplikat [Nebeneffekt optimiert out] (http://stackoverflow.com/questions/31097067/side-effect-optimized-out) –

+0

Ja, sie sprechen beide über das gleiche Thema. Allerdings weiß die Art von Menschen, die sich diese Frage fragen, wahrscheinlich nicht, was eine Nebenwirkung ist oder dass sie ihr Problem verursacht. Daher denke ich, dass meine Frage eher von den Leuten gefunden wird, die ihre Antwort brauchen. *** Zusammenfassend ist der einzige Grund für die Beibehaltung dieser Frage hier, dass es in der Frage nicht die Worte Nebeneffekt enthält. *** Wenn Sie das nicht für wichtig halten, wäre es sinnvoll, es zu entfernen. –

Antwort

5

Sie möchten nicht map für einen Nebeneffekt wie Alarm verwenden. Das Problem, das Sie sehen, ist ein Ergebnis von map ist faul, also wird es die Arbeit nicht tatsächlich tun, bis Sie die Elemente der resultierenden Sequenz konsumieren. Wenn Sie wirklich Nebeneffekt für Dinge tun wollen, doseq könnte eine bessere Option sein, besonders wenn Sie nicht eine Folge der Ergebnisse benötigen:

(doseq [msg ["hey1" "hey2"]] 
    (.alert js/window msg)) 

Oder können Sie doall verwenden, um die Bewertung der erzwingen ganze Sequenz:

(doall (map #(.alert js/window %) ["hey1" "hey2"])) 
Verwandte Themen