2016-12-07 4 views
1

я столкнулся с очень странный вопрос сегодняразница с «взятием» в clojure и clojurescript?

(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

Я предполагаю, что есть какая-то другая причина, по которой вы используете 'string/split' в строке, но просто подумал, что я бы сказал, что строки привязаны к последовательностям. Поэтому вы можете просто использовать '(принять 3 вкладки)' в вашем примере. –

+0

эй, @NathanDavis, я не думал об этом. спасибо за указание на это :) –

ответ

2

В cljs:

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

дает:

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

Так что ваш (take 3 ... принимает "", "c" и "o".

Что касается причин - возможно, что базовый метод java String.split, вызываемый clojure и clojurescript, ведет себя по-разному между версиями. [edit]

+0

Это не Clojure 1.7, который ведет себя таким образом, это ClojureScript. Интересно, разве это различие в двигателях регулярных выражений, протекающих через абстракцию? '(string/split" foo "" ")' дает правильные результаты в ClojureScript, но терпит неудачу, потому что это не шаблон регулярного выражения в Clojure. – jszakmeister

+0

@jszakmeister В clojure, '(string/split" foo "#" ")' определенно является допустимым шаблоном. Что касается остальной части того, что вы написали, я использовал версию приложения для телефона для замены, чтобы проверить это, и это было 1.7.0-alpha5, поэтому я сделал ошибку, считая, что это clojure. Я думаю, вы можете быть правы, что это различие в регулярном выражении. Часто функция регулярных выражений возвращает совпадение в первой позиции возвращаемого вектора, так что это, вероятно, то, что происходит. – Josh

+0

Правильно, '(string/split" foo "#" ")' имеет допустимый шаблон регулярного выражения, но я написал '(string/split" foo "" ")' (без хэша перед пустой строкой). Это правильно расщепляет строку на ClojureScript, но не работает в Clojure. – jszakmeister

Смежные вопросы