2012-01-11 14 views
0

私の作品次のコードを持っている:それはもうコンパイルされませんなぜ - >は(fn ...)を取っていないのですか?

(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))))) 

(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))) 

を、私はこれに、フィルタ(f)とマップ(m)関数をインライン化することを変更した場合を。エラーは次のとおりです。

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

誰も私にこれを説明することはできますか?

私が解決しようとしている問題は、マップおよびフィルタが最後のパラメータとしてコレクションを取ることです、まだstr/partitionは最初としてコレクションを取りますので、私は->を使用して2つをミックスしようとしているが、mapをカリー化だし、 filterは、コレクションの1つ(最初の)パラメータのみを取り込む関数に変換されます。

+1

[関数呼び出し] - > [スレッドマクロ](http://stackoverflow.com/questions/7838326/function-call-in-threading-macro) – 4e6

答えて

2

関数呼び出しとして関数宣言を使用しています。それを直す(醜い)方法は、(fn [..] ..)を(fn [..] ...)に置き換えることです。

+0

これは私がやったことです –

3

->->>をある程度混在させることができます。

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

通常、このような問題は、1つのフォームであまりにも多くを実行しようとしているという兆候です。この簡単な例は簡単に修正できます。

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

- >はマクロです。それはあなたがそれを与えるコードを操作し、そのコードを実行します。そのような匿名関数をインラインで使用しようとすると、前の式がfnの最初の引数としてスレッド化されます。それはあなたが望むものではありません。実際の関数の最初の引数としてそれらをスレッド化する必要があります。

- >を使用するには、最初の例のように事前に関数を宣言する必要があります。

関連する問題