2012-03-06 8 views
1

この機能が期待どおりに機能しないのはなぜですか?この機能が期待どおりに機能しないのはなぜですか?

(defn my-juxt 
    [& fns] 
    (if (= 1 (count fns)) 
    (fn [& a] (list (apply (first fns) a))) 
    (fn [& a] 
     (cons (apply (first fns) a) ((my-juxt (rest fns)) a))))) 

注:これは動作します -

(defn new-juxt 
    [& fns] 
    (fn [& a] 
    (map #(apply % a) fns))) 
+1

は 'fns'あなたは末尾再帰を使用していないとしてスタックを爆破するために長いリストではありません願っています:) – Ankur

答えて

6

問題は可変引数が使用されている方法です。 my-juxtのパラメータは[& fns]ですが、最後の文字列には[fns]が与えられています。結果として返される関数も同じです:[a]が提供されている間は、[& a]が必要です。

以下のコードは動作します(そこに2つの余分なapply年代に注意してください)

(defn my-juxt 
    [& fns] 
    (if (= 1 (count fns)) 
    (fn [& a] (list (apply (first fns) a))) 
    (fn [& a] 
     (cons (apply (first fns) a) 
      (apply (apply my-juxt (rest fns)) a))))) 
関連する問題