Clojurescript地图功能出乎意料地表现出来

Jas*_*ese 1 printing clojure clojurescript map-function

我有两个代码片段,我认为这两个代码片段都会产生警报.但是,第一个结果为none,而第二个执行警报.

(map #(.alert js/window %) ["hey1" "hey2"])
Run Code Online (Sandbox Code Playgroud)

这个轻微的修改按预期打印(零nil),以及修复警报问题.问题是为什么

(print (map #(.alert js/window %) ["hey1" "hey2"]))
Run Code Online (Sandbox Code Playgroud)

另一个奇怪的观察是,第一个代码片段来自浏览器 - repl,但不是在键入代码时.

地图功能副作用是免费的,但打印不是吗?也许我不知道一些核心代码优化?

解决方法和答案都很受欢迎.如果您需要更多信息,请在评论中告诉我.

[org.clojure/clojurescript"1.8.51"]

BOOT_CLOJURE_VERSION = 1.7.0

BOOT_VERSION = 2.5.5

java版"1.8.0_101"

说明:Ubuntu 14.04.4 LTS

Joh*_*ter 5

您不希望map用于像警报这样的副作用操作.你看到的问题map是懒惰的结果,所以在你使用结果序列的元素之前它实际上不会完成工作.如果你真的想做副作用的事情,doseq可能是一个更好的选择,特别是如果你不需要一系列结果:

(doseq [msg ["hey1" "hey2"]]
  (.alert js/window msg))
Run Code Online (Sandbox Code Playgroud)

或者您可以使用doall强制评估整个序列:

(doall (map #(.alert js/window %) ["hey1" "hey2"]))
Run Code Online (Sandbox Code Playgroud)