Clojure 功能组合失效

Clojure 功能组合失效,clojure,Clojure,我正在研究解决这个问题的办法。我不明白为什么我的解决方案不起作用,但使用comp的定义确实起作用。当我看到的定义,我看到: 而我的解决方案非常相似: (defn mycomp ([f] f) ([f1 f2] (fn ([] (f1 (f2))) ([a] (f1 (f2 a))) ([a & more] (f1 (apply f2 a more))) ) ) ([f1 f2 &

我正在研究解决这个问题的办法。我不明白为什么我的解决方案不起作用,但使用
comp
的定义确实起作用。当我看到的定义,我看到:

而我的解决方案非常相似:

(defn mycomp
    ([f] f)
    ([f1 f2]
       (fn
        ([] (f1 (f2)))
        ([a] (f1 (f2 a)))
        ([a & more] (f1 (apply f2 a more)))
       )
     )
    ([f1 f2 & fs]
       (let [fxns (reverse (list f1 f2 fs))]
          (fn [& args]
        (loop [ret (apply (first fxns) args) fxns (next fxns)]
           (if fxns
             (recur ((first fxns) ret) (next fxns))
             ret))))))
从我可以看出,两者之间的最大区别在于,第一个定义由三个或更多函数组成,而第二个定义由两个或更多函数组成

请指出我的定义有哪些地方不正确。

(列表f1 f2 fs)
看起来很可疑-前两个是函数,最后一个是函数列表,因此您要创建一个包含多个对象类型的列表,然后统一处理它们。您可以使用
list*
来解决这个问题


但更广泛的一点是:天哪,不要尝试做“两个或更多”的函数,只做零个或更多!没有特殊情况意味着更少的代码;clojure.core只有一堆展开的案例,以提高速度。如果你的骨架是
(fn[&fs](fn[&args]…)
,你的生活就会轻松得多。

谢谢你指出
列表*
的事情,我不明白
列表
列表*
之间有什么区别。此外,我使用零个或多个参数重新实现了我的解决方案,这使得代码更容易理解。再次感谢!
(defn mycomp
    ([f] f)
    ([f1 f2]
       (fn
        ([] (f1 (f2)))
        ([a] (f1 (f2 a)))
        ([a & more] (f1 (apply f2 a more)))
       )
     )
    ([f1 f2 & fs]
       (let [fxns (reverse (list f1 f2 fs))]
          (fn [& args]
        (loop [ret (apply (first fxns) args) fxns (next fxns)]
           (if fxns
             (recur ((first fxns) ret) (next fxns))
             ret))))))