【问题标题】:Clojurescript map function behaving unexpectedlyClojurescript 映射函数行为异常
【发布时间】:2016-11-12 04:15:43
【问题描述】:

我有两个代码 sn-ps,我认为它们都会导致警报。然而,第一个结果没有,而第二个执行警报。

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

此轻微修改按预期打印 (nil nil),并修复了警报问题。问题是为什么

(print (map #(.alert js/window %) ["hey1" "hey2"]))

另一个奇怪的观察是,第一个 sn-p 在浏览器复制中工作,但不是在输入代码时。

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

解决方法和答案都值得赞赏。如果您需要更多信息,请在评论中告诉我。

[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

【问题讨论】:

  • Side effect optimized out的可能重复
  • 是的,他们都在谈论同一个话题。然而,想知道这个问题的人可能不知道副作用是什么,或者它是导致他们问题的原因。因此,我认为我的问题更有可能被需要答案的人找到。 总而言之,在这里保留这个问题的唯一原因是它不包含问题中的副作用一词如果您认为这不重要,那么它会合理地删除它。

标签: printing clojure clojurescript map-function


【解决方案1】:

您不想将map 用于警报等副作用操作。您看到的问题是 map 懒惰的结果,因此在您使用结果序列的元素之前它实际上不会完成工作。如果你真的想做一些副作用之类的事情,doseq 可能是一个更好的选择,特别是如果你不需要一系列结果:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多