2012-01-11 72 views
0

我有以下的代碼工作的:如果我改變它內聯過濾器(f)和MAP(m)函數來此爲什麼 - >不採取(FN)?

(def *primes* 
    (let [l "2 3 5 7 11 13 17 19 23 29 31" 
     f (fn [lst] (filter #(< 0 (count (str/trim %))) lst)) 
     m (fn [lst] (map #(Integer/parseInt %) lst))] 
    (-> l 
     (str/partition #"[0-9]+") 
     f 
     m))) 

(def *primes* 
    (let [l "2 3 5 7 11 13 17 19 23 29 31"] 
    (-> l 
     (str/partition #"[0-9]+") 
     (fn [lst] (filter #(< 0 (count (str/trim %))) lst)) 
     (fn [lst] (map #(Integer/parseInt %) lst))))) 

它不會再編譯。錯誤是:

#<CompilerException java.lang.RuntimeException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol (NO_SOURCE_FILE:227)>

誰能解釋這樣對我?

,我試圖解決的問題是,地圖和過濾器需要收集的最後一個參數,但str/partition需要收集爲第一,所以我想這兩個使用->,但柯里map混合和filter成函數,只需要一個(第一個)參數進行採集進入。

+1

請參閱[函數調用 - >線程宏](http://stackoverflow.com/questions/7838326/function-call-in-threading-macro) – 4e6 2012-01-11 07:30:25

回答

2

您使用的函數聲明爲函數調用。立即(醜陋)的方式來解決它是替代(FN [..] ..)與((FN [..] ...))

+0

這就是我最終做的 – 2012-01-11 13:17:57

3

你可以混合->->>到一定程度。

(-> l 
    (str/partition #"[0-9]+") 
    (->> (filter #(< 0 (count (str/trim %))))) 
    (->> (map #(Integer/parseInt %)))) 

但通常像這樣的問題是一個跡象,你試圖在一種形式做太多。這個簡單的例子可以很容易地修復。

(->> (str/partition l #"[0-9]+") 
    (filter #(< 0 (count (str/trim %)))) 
    (map #(Integer/parseInt %))) 
1

- >是一個宏。它操縱你給它的代碼,然後執行該代碼。當你嘗試使用內聯這樣的匿名函數時,會發生什麼情況?以前的表達式是否會作爲fn的第一個參數進行線程化。這不是你想要的。您希望它們作爲實際函數的第一個參數進行線程化。

使用 - >,你必須事先申報的功能,當你在你的第一個例子。

相關問題