2012-05-12 10 views
9

Actualmente estoy tratando de aprender Clojure y me gustaría escribir una función que tiene una cantidad variable de parámetros. Esta función debe filtrar cada entrada para verificar si es una cadena o no. Si lo hace, cada entrada de tipo cadena debe ser devuelto ..Tipo de filtro Cadena en Clojure

Clojure es difícil para mí y diferente forma de pensar, pero estoy en el sentido aquí .. Me parece que no puede resolverlo:

(defn returnString [& y] 
(if (next y) 
(filter (fn [x] (= (type x) "java.lang.String"))y) 
(recur (next x)))) 

Gracias!

Respuesta

11

Hay una función llamada string? que devuelve verdadero si el argumento es una cadena, o falso si no.

=> (string? "hi") 
true 
=> (string? 100) 
false 
=> (string? ["a" "b" "c"]) 
false 

Así que con eso en mente, su función se vería así:

(defn return-strings [& vals] 
    (filter string? vals)) 

La función de filtro devolverá una secuencia (esencialmente una colección) de valores, por lo que no hay necesidad de preocuparse por la recursividad (es decir, usando recur) en su función personalizada para este caso.


La función anónima que utiliza para determinar qué es una cadena está muy cerca de ser correcta. Si se echa un vistazo a la fuente de string? mediante la introducción de (source string?) en su REPL, verá:

(fn [x] (instance? String x)) 

Aunque, el enfoque que está tomando funcionaría también. Solo necesita especificar la clase String en lugar del valor de cadena que estaba dando. (Tenga en cuenta que puede dejar java.lang porque ese paquete se incluye automáticamente tal como está en Java).

(fn [x] (= (type x) String)) 
Cuestiones relacionadas