Как мне превратить (seq "foo") обратно в строку? - PullRequest
20 голосов
/ 04 мая 2011

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

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

Ответы [ 3 ]

29 голосов
/ 04 мая 2011

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

user=> (apply str (seq "foo"))
"foo"
6 голосов
/ 04 мая 2011

На самом деле ничто не может заполнить пробел, чтобы сделать выражение (= "foo" _ (str (seq "foo"))), равное 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.

Применить принимает функцию (в данном случае 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
4 голосов
/ 13 мая 2011

Или вы можете использовать удобную clojure.string/join

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...