Estoy explorando clojure y estoy perplejo. ¿Qué completa el espacio en blanco para que la siguiente expresión eval sea verdadera?¿Cómo devuelvo (seq "foo") a una cadena?
(= "foo" ___ (str (seq "foo")))
Estoy explorando clojure y estoy perplejo. ¿Qué completa el espacio en blanco para que la siguiente expresión eval sea verdadera?¿Cómo devuelvo (seq "foo") a una cadena?
(= "foo" ___ (str (seq "foo")))
Es necesario utilizar aplicar función:
user=> (apply str (seq "foo"))
"foo"
En realidad nada puede llenar el espacio en blanco para hacer la expresión (= "foo" _ (str (ss "foo"))) eval a verdadero porque (str (seq "foo")) => "(\ f \ o \ o)" que no es igual a "foo", entonces ya tenemos una desigualdad y un tercer elemento, sin importar el valor , para llenar el espacio en blanco no puede hacer que la expresión se evalúe como verdadera
Si tuviera la intención de preguntar
(= "foo"
(____ str (seq "foo")))
Entonces la respuesta sería aplicar correctamente como respondió alex.
user> (doc apply)
-------------------------
clojure.core/apply
([f args* argseq])
Applies fn f to the argument list formed by prepending args to argseq.
Aplicar toma una función (en este caso str) y pide str con los argumentos presentes en la SEC
user> (seq "foo")
(\f \o \o)
user> (str \f \o \o)
"foo"
Y oh, por cierto:
user> (= 1 1 1)
true
user> (= 1 2 1)
false
o puede utilizar el conveniente clojure.string/join
(require 'clojure.string)
(clojure.string/join (seq "foo"))
También se imprimirá "foo"
. Por supuesto, puede definir su propio join
utilizando la técnica mencionada anteriormente (para evitar escribir (apply str seq)
todo el tiempo).
gracias. esto ayuda. – mark
¿Las funciones de Clojure tienen una aridad máxima (significativamente menor que, por ejemplo, la longitud máxima del vector)? P.ej. si la cadena fuera realmente larga aquí, entonces 'apply' trataría de llamar' str' con tantos argumentos (caracteres de la cadena) que la llamada fallaría. – Lassi