2016-12-07 23 views
1

i stand vor einer Super seltsame Frage heuteUnterschied mit "take" in clojure und clojurescript?

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

kehrt

@@@ :cognitive cognitive cog 

in Clojure, aber

@@@ :cognitive cognitive co 

in clojurescript (gerendert Reagenz). Beachten Sie die fehlenden g in der cljs Version

i doall vor-und-nach dem (take 3 ... Ausdruck versucht, aber ohne Erfolg

BTW, ich bin mit

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

für mein cljs Projekt und

[org.clojure/clojure "1.8.0"] 

für die CLJ Projekt

+1

Ich vermute, es gibt einen anderen Grund, warum Sie 'string/split' in der Zeichenfolge verwenden, aber ich dachte, ich würde erwähnen, dass Strings zu Sequenzen gezwungen werden. Du könntest einfach '(take 3 tab)' in deinem Beispiel verwenden. –

+0

hey @NathanDavis, daran habe ich nicht gedacht. Danke für das Aufzeigen :) –

Antwort

2

In cljs:

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

gibt Ihnen:

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

So Ihre (take 3 ... nimmt "", "c" und "o".

Warum - es ist möglich, dass die zugrunde liegende String.split Java-Methode, die von Clojure und Clojurescript genannt wird, sich zwischen den Versionen unterschiedlich verhält. [edit]

+0

Es ist nicht Clojure 1.7, das sich so verhält, es ist ClojureScript. Ich frage mich, ob das ein Unterschied in den Regex-Engines ist, die durch die Abstraktion fließen? '(string/split" foo "" ")' liefert die richtigen Ergebnisse in ClojureScript, scheitert aber, weil es in Clojure kein Regex-Muster ist. – jszakmeister

+0

@jszakmeister In clojure ist '(string/split" foo "#" ")' definitiv ein gültiges Muster. In Bezug auf den Rest von dem, was Sie geschrieben haben, habe ich eine Telefon-App-Version des repl verwendet, um das zu testen, und es war 1.7.0-alpha5, also machte ich den Fehler zu denken, dass es clojure war. Ich denke, Sie haben vielleicht recht, dass es sich um einen Regex-Code-Unterschied handelt. Oft wird eine Regex-Funktion eine Übereinstimmung an der ersten Position des zurückgegebenen Vektors zurückgeben, was wahrscheinlich geschieht. – Josh

+0

Korrekt, '(string/split" foo "#" ")' 'hat ein gültiges Regex-Muster, aber ich schrieb' (string/split "foo" "") '(kein Hash vor der leeren Zeichenfolge). Dies teilt die Zeichenfolge in ClojureScript korrekt auf, schlägt aber in Clojure fehl. – jszakmeister

Verwandte Themen