Может ли clojure оценить цепочку смешанных функций арности и при необходимости вернуть частичную функцию?

Предположим, у вас есть три функции арности 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)))))

возвращает частичную функцию арности 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)))
5
задан dansalmo 13 August 2012 в 05:12
поделиться