Clojurescript 映射函数行为异常
Clojurescript map function behaving unexpectedly
我有两个代码片段,我认为它们都会导致警报。然而,第一个结果 none 而第二个执行警报。
(map #(.alert js/window %) ["hey1" "hey2"])
这个细微的修改会按预期打印 (nil nil),并修复了警报问题。问题是为什么?
(print (map #(.alert js/window %) ["hey1" "hey2"]))
另一个奇怪的观察结果是第一个片段在浏览器-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
您不想将 map
用于像警报这样的副作用操作。您看到的问题是 map
懒惰的结果,因此在您使用结果序列的元素之前它不会真正完成工作。如果你真的想做一些副作用之类的事情,doseq
可能是一个更好的选择,特别是如果你不需要一系列结果:
(doseq [msg ["hey1" "hey2"]]
(.alert js/window msg))
或者你可以使用doall
来强制计算整个序列:
(doall (map #(.alert js/window %) ["hey1" "hey2"]))
我有两个代码片段,我认为它们都会导致警报。然而,第一个结果 none 而第二个执行警报。
(map #(.alert js/window %) ["hey1" "hey2"])
这个细微的修改会按预期打印 (nil nil),并修复了警报问题。问题是为什么?
(print (map #(.alert js/window %) ["hey1" "hey2"]))
另一个奇怪的观察结果是第一个片段在浏览器-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
您不想将 map
用于像警报这样的副作用操作。您看到的问题是 map
懒惰的结果,因此在您使用结果序列的元素之前它不会真正完成工作。如果你真的想做一些副作用之类的事情,doseq
可能是一个更好的选择,特别是如果你不需要一系列结果:
(doseq [msg ["hey1" "hey2"]]
(.alert js/window msg))
或者你可以使用doall
来强制计算整个序列:
(doall (map #(.alert js/window %) ["hey1" "hey2"]))