2012-05-12 17 views
9

Şu anda Clojure'ı öğrenmeye çalışıyorum ve değişken miktarda parametreler içeren bir işlev yazmak istiyorum. Bu işlev, bir dizgenin olup olmadığını kontrol etmek için her girişi filtrelemelidir. Eğer varsa, dize türünde her giriş Bunu çözmek gibi olamaz .. Burada doğru yöne IClojure için filtre türü String

Clojure beni ve düşünce farklı bir yol zordur .. geri dönmesine rağmen duyuyorum edilmelidir:

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

Teşekkürler!

cevap

11

string? adı verilen bir argüman argüman bir dizgeyse veya true değilse false döndürür.

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

Yani akılda ile, sizin fonksiyonu gibi görünecektir:

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

özyineleme hakkında gerek endişe (yok yani, bir değerler dizisi (aslında bir koleksiyon) dönecektir filtre işlevi Bu durumda, özel işlevinize recur kullanarak).


Dizenin neyi olduğunu belirlemek için kullandığınız anonim işlev doğru olmaya çok yakındır. Eğer repl içine (source string?) girerek string? için kaynak bir göz atacak olursak, şunu görürsünüz:, alıyorsun yaklaşım de çalışmak

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

rağmen. Verdiğiniz dize değeri yerine String sınıfını belirtmeniz yeterlidir. (Bu paket, Java'da olduğu gibi otomatik olarak dahil edildiğinden, java.lang'u kapatabilirsiniz.)

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