#clojure
#clojure
Вопрос:
Я изучаю clojure и озадачен. Что заполняет пробел, чтобы следующее выражение приняло значение true?
(= "foo" ___ (str (seq "foo")))
Ответ №1:
Вам нужно использовать функцию apply:
user=> (apply str (seq "foo"))
"foo"
Комментарии:
1. Имеют ли функции Clojure максимальную размерность (значительно меньшую, чем, например, максимальная длина вектора)? Например. если строка здесь была действительно длинной, то
apply
попытались бы вызватьstr
с таким количеством аргументов (символов из строки), что вызов завершился бы неудачей.
Ответ №2:
На самом деле ничто не может заполнить пробел, чтобы сделать выражение (= «foo» _ (str (seq «foo»))) равным true, потому что (str (seq «foo»)) => «(f o o)», которое не равно «foo», поэтому у нас уже есть неравенство, и третий элемент, независимо от того, какое значение, для заполнения пробела, не может заставить выражение оценить значение true
Если вы хотели спросить
(= "foo"
(____ str (seq "foo")))
Тогда ответом было бы правильно применить, как ответил Алекс.
user> (doc apply)
-------------------------
clojure.core/apply
([f args* argseq])
Applies fn f to the argument list formed by prepending args to argseq.
Apply принимает функцию (в данном случае str) и вызывает str с аргументами, присутствующими в seq
user> (seq "foo")
(f o o)
user> (str f o o)
"foo"
И, кстати:
user> (= 1 1 1)
true
user> (= 1 2 1)
false
Комментарии:
1. на самом деле
(comp (partial apply str) read-string)
сработало бы для заполнения первого пробела 🙂
Ответ №3:
Или вы могли бы использовать удобный clojure.string/join
(require 'clojure.string)
(clojure.string/join (seq "foo"))
Также будет напечатано "foo"
. Вы могли бы, конечно, определить свой собственный, join
используя ранее упомянутую технику (чтобы избежать постоянной записи (apply str seq)
).