假设您具有以下三个函数,即 arity 1、2 和 3:
(defn I [x] x)
(defn K [x y] x)
(defn S [x y z] (x z (y z)))
clojure 是否有评估函数或习语来评估:
(I K S I I) as (I (K (S (I (I)))))
返回 arity 2 的偏函数?
我正在考虑创建一个宏,它可以采用上面的简单函数定义并将它们扩展为可以返回部分结果的多参数函数。如果已经有内置或惯用的方法来完成此操作,我不想创建宏。
以下是扩展宏对上述功能的要求:
(defn I
([x] I x)
([x & more] (apply (I x) more)))
(defn K
([x] (partial K x))
([x y] x)
([x y & more] (apply (K x y) more)))
(defn S
([x] (partial S x))
([x y] (partial S x y))
([x y z] (x z (y z)))
([x y z & more] (apply (S x y z) more)))