2012-05-12 11 views
9

Attualmente sto cercando di imparare Clojure e vorrei scrivere una funzione che ha una quantità variabile di parametri. Questa funzione dovrebbe filtrare ogni input per verificare se si tratta di una stringa o meno. Se lo fa, ogni input di tipo stringa deve essere restituito ..Tipo di filtro String in Clojure

Clojure è difficile per me e diverso modo di pensare, ma sono io a destra direzione qui .. Io non riesco a risolverlo:

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

Grazie!

risposta

11

Esiste una funzione denominata string? che restituisce true se l'argomento è una stringa o false in caso contrario.

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

Quindi, con questo in mente, la funzione sarà simile:

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

La funzione di filtro restituirà una sequenza (essenzialmente una raccolta) di valori, quindi non c'è nessuna preoccupazione bisogno di informazioni sulla ricorsione (cioè, usando recur) nella tua funzione personalizzata per questo caso.


La funzione anonima che si utilizza per determinare ciò che è una stringa è molto vicino ad essere corretta. Se si dà un'occhiata alla fonte per string? inserendo (source string?) nella vostra REPL, vedrete:

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

Anche se, l'approccio che sta assumendo avrebbe funzionato pure. Hai solo bisogno di specificare la classe String invece del valore stringa che stavi dando. (Nota, è possibile lasciare fuori java.lang perché questo pacchetto è incluso automaticamente proprio come è in Java.)

(fn [x] (= (type x) String)) 
Problemi correlati