以下のように、アリティ1、2、3の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のparital関数を返しますか?
上記の単純な関数定義を取得して、部分的な結果を返すことができるマルチアリティ関数に拡張できるマクロを作成することを検討しています。これを実現するための組み込みの方法または慣用的な方法がすでにある場合は、マクロを作成したくありません。
上記の関数に対して展開されたマクロが必要とするものは次のとおりです。
(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)))