Я изучаю clojure и озадачен. Что заполняет пробел, чтобы сделать следующее выражение eval равным true?Как превратить (seq "foo") обратно в строку?
(= "foo" ___ (str (seq "foo")))
Я изучаю clojure и озадачен. Что заполняет пробел, чтобы сделать следующее выражение eval равным true?Как превратить (seq "foo") обратно в строку?
(= "foo" ___ (str (seq "foo")))
Вы должны использовать применять функцию:
user=> (apply str (seq "foo"))
"foo"
На самом деле ничто не может заполнить пробел, чтобы сделать выражение (= "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
Или вы могли бы использовать получатель clojure.string/join
(require 'clojure.string)
(clojure.string/join (seq "foo"))
Будет печать "foo"
. Вы могли бы определить свой собственный join
, используя ранее упомянутую технику (чтобы избежать записи (apply str seq)
все время).
спасибо. это помогает. – mark
Имеют ли функции Clojure максимальную arity (значительно ниже, чем, например, максимальная длина вектора)? Например. если строка была действительно длинной здесь, тогда 'apply' попытается вызвать' str' с таким количеством аргументов (символов из строки), что вызов завершится неудачно. – Lassi