【问题标题】:difference with "take" in clojure and clojurescript?与clojure和clojurescript中的“take”有什么区别?
【发布时间】:2016-12-07 15:24:28
【问题描述】:

我今天遇到了一个非常奇怪的问题

(let [t :cognitive
      tab (name t)
      tab-name (string/join "" (take 3 (string/split tab #"")))]
  (println "@@@" t tab tab-name))

返回

@@@ :cognitive cognitive cog

在clojure中,但是

@@@ :cognitive cognitive co

在 clojurescript 中(使用试剂渲染)。注意 cljs 版本中缺少的g

我在(take 3 ... 表达式之前和之后尝试过doall,但无济于事

顺便说一句,我正在使用

[org.clojure/clojure "1.7.0"]
[org.clojure/clojurescript "1.7.170"]

对于我的 cljs 项目,以及

[org.clojure/clojure "1.8.0"]

对于 clj 项目

【问题讨论】:

  • 我猜你在字符串上使用string/split 是有其他原因的,但只是想我会提到字符串被强制转换为序列。所以你可以在你的例子中使用(take 3 tab)
  • 嘿@NathanDavis,我没想到。感谢您指出:)

标签: clojure clojurescript


【解决方案1】:

在 cljs 中:

(string/split (name :cognitive) #"")

给你:

["" "c" "o" "g" "n" "i" "t" "i" "v" "e"]

所以您的(take 3 ... 正在使用"""c""o"

至于为什么——clojure 和 clojurescript 调用的底层 String.split java 方法可能在版本之间表现不同。 [编辑]

【讨论】:

  • 不是 Clojure 1.7 的行为方式,而是 ClojureScript。我想知道这是否是通过抽象泄漏的正则表达式引擎的差异? (string/split "foo" "") 在 ClojureScript 中产生正确的结果,但由于它不是 Clojure 中的正则表达式模式而失败。
  • @jszakmeister 在 clojure 中,(string/split "foo" #"") 绝对是一个有效的模式。关于你写的其余内容,我使用了 repl 的手机应用程序版本来测试它,它是 1.7.0-alpha5,所以我误以为它是 clojure。我认为您可能是对的,这是正则表达式代码的差异。通常,一个正则表达式函数会在返回向量的第一个位置返回一个匹配项,所以这可能就是正在发生的事情。
  • 正确,(string/split "foo" #"") 有一个有效的正则表达式模式,但我写了(string/split "foo" "")(空字符串前面没有散列)。这会在 ClojureScript 中正确拆分字符串,但在 Clojure 中会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多