Подтвердить что ты не робот

Как включить (seq "foo" ) обратно в строку?

Я изучаю clojure и озадачен. Что заполняет пробел, чтобы сделать следующее выражение eval равным true?

(= "foo" ___ (str (seq "foo")))
4b9b3361

Ответ 1

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

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

Ответ 2

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

Если вы хотели спросить

(= "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.

Применяет функцию (в этом случае str) и вызывает str с аргументами, присутствующими в seq

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

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

И о, btw:

user> (= 1 1 1)
true

user> (= 1 2 1)
false

Ответ 3

Или вы можете использовать convient clojure.string/join

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

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