2013-06-23 20 views
5

Bir dize alan ve bir filtre işlevi sonucu döndüren bir işlev yazmaya çalışıyorum (4clojure sorunları ile çalışıyorum). Sonuç da bir dizi olmalı.Clojure işlevi, filtre işlevinin sonucundan bir dize oluşturmakta başarısız oluyor

ben yazdım:

Şimdi
(fn my-caps [s] 
    (filter #(Character/isUpperCase %) s)) 

(my-caps "HeLlO, WoRlD!") 

Result: (\H \L \O \W \R \D) 

Böyle katılmak/clojure.string kullanarak, bu listenin dışında bir dize oluşturmak için çalışıyorum: Sonuç

(fn my-caps [s] 
    (clojure.string/join (filter #(Character/isUpperCase %) s))) 

ancak aynıdır. Ayrıca hiçbir başarı ile apply str kullanmayı denedim.

cevap

3

Bu deneyin:

(defn my-caps [s] 
    (->> (filter #(Character/isUpperCase %) s) 
     (apply str))) 

filter fonksiyonu yapay sekans döndürür. Bir string almak istiyorsanız, str işlevini uygulayarak diziyi diziye dönüştürmelisiniz.

+0

Teşekkürler! Bu bana çift ok-threading makroyu gösterdi. Daha önce iş parçacığı makrolarını bilmiyordum. –

+0

@ntalbs, neden '- >>' operatörünü burada kullanıyorsunuz? Basit bir işlev çağrısı, 'apply' –

+2

@ ÓscarLópez'i çağırmak için yeterlidir Evet, haklısınız. Sonuç aynı. Bununla birlikte, '- >>' kullanarak kod okumayı okumayı ve düşünce sürecimden yazmayı kolaylaştırır. Bu kadar. Bu bir tür kişisel tercihler. – ntalbs

4

filter tarafından döndürülen tembel diziyi str işlevini uygulayarak bir dizeye dönüştürmeniz gerekir. Ayrıca, yeni bir işlev tanımlamak için defn kullanmak - aşağıdaki gibi yapılır: beklendiği gibi çalışır

(defn my-caps [s] 
    (apply str (filter #(Character/isUpperCase %) s))) 

:

(my-caps "HeLlO, WoRlD!") 
=> "HLOWRD" 
4

yapıştırdığınız snippet'ine son kod çalışıyor. join gerçekten bir dizge döndürüyor.

+0

Haklısınız. Şimdiye kadar dosyayı REPL'e yeniden yükledim ancak sadece yeniden başlattıktan sonra çalıştı. İplik bir çöplük değildi - Bir koleksiyondan dize yaratmanın yeni yollarını öğrendim. –

İlgili konular