2016-12-07 25 views
1

我面對一個超級古怪的問題,今天與clojure和clojurescript中的「take」的區別?

(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版本

我曾嘗試doall之前和之後的(take 3 ...表達,但無濟於事

BTW失蹤g,我使用

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

我cljs項目和

[org.clojure/clojure "1.8.0"] 

爲CLJ項目

+1

我猜你還有一些其他的原因,你使用字符串/字符串拆分,但只是想我會提到字符串被強制序列。所以你可以在你的例子中使用'(take 3 tab)'。 –

+0

嘿@NathanDavis,我沒有想到這一點。感謝您指出:) –

回答

2

在cljs:

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

爲您提供:

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

所以你(take 3 ...正在"""c""o"

至於爲什麼 - 可能由clojure和clojurescript調用的基礎String.split java方法在版本之間表現不同。 [編輯]

+0

這不是Clojure 1.7,它的行爲就是這樣,它就是ClojureScript。我想知道這是否是通過抽象泄漏的正則表達式引擎的差異? '(string/split「foo」「」)'在ClojureScript中產生正確的結果,但是失敗了,因爲它不是Clojure中的正則表達式模式。 – jszakmeister

+0

@jszakmeister在clojure中,'(string/split「foo」#「」)'絕對是一個有效的模式。關於你寫的其餘部分,我用了一個手機應用版本的repl來測試它,它是1.7.0-alpha5,所以我犯了一個錯誤,認爲它是clojure。我認爲你可能是正確的,這是一個正則表達式的代碼差異。通常一個正則表達式函數會在返回的向量的第一個位置返回一個匹配,所以這可能是發生了什麼事情。 – Josh

+0

正確,'(string/split「foo」#「」)'有一個有效的正則表達式模式,但是我寫了'(string/split「foo」「」)'(在空字符串前沒有散列)。這在ClojureScript中正確地分割了字符串,但在Clojure中失敗。 – jszakmeister

相關問題