2011-05-04 2 views

ответ

29

Вы должны использовать применять функцию:

user=> (apply str (seq "foo")) 
"foo" 
+0

спасибо. это помогает. – mark

+0

Имеют ли функции Clojure максимальную arity (значительно ниже, чем, например, максимальная длина вектора)? Например. если строка была действительно длинной здесь, тогда 'apply' попытается вызвать' str' с таким количеством аргументов (символов из строки), что вызов завершится неудачно. – Lassi

6

На самом деле ничто не может заполнить пробел, чтобы сделать выражение (= "Foo" _ (ул (Seq "Foo"))) eval to true, потому что (str (seq "foo")) => "(\ f \ o \ o)", который не равен "foo", поэтому мы уже имеем неравенство и третий элемент, независимо от того, какое значение , чтобы заполнить пробел, не может сделать выражение оценено как истинное

Если вы намеревались спросить

(= "foo" 
    (____ str (seq "foo"))) 

Тогда ответ будет справедливо применяться, если ответить alex.

user> (doc apply) 
------------------------- 
clojure.core/apply 
([f args* argseq]) 
    Applies fn f to the argument list formed by prepending args to argseq. 

Нанести принимает функцию (в данном случае ул) и называет ул с арг, присутствующими в SEQ

user> (seq "foo") 
(\f \o \o) 

user> (str \f \o \o) 
"foo" 

И о, кстати:

user> (= 1 1 1) 
true 

user> (= 1 2 1) 
false 
+5

фактически '(comp (partial apply str) read-string)' будет работать, чтобы заполнить первый пробел :-) – mikera

+0

good one @mikera – Jaskirat

4

Или вы могли бы использовать получатель clojure.string/join

(require 'clojure.string) 
(clojure.string/join (seq "foo")) 

Будет печать "foo". Вы могли бы определить свой собственный join, используя ранее упомянутую технику (чтобы избежать записи (apply str seq) все время).

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