5

以下のように、アリティ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)))
4

1 に答える 1

5

あなたが何をしようとしているのか完全にはわかりませんが、このcomp関数は、あなたが話しているように見えるこの種の「関数連鎖」を行うのに役立ちます。例えば:

user> ((comp vec rest list) 1 2 3 4 5)
=> [2 3 4 5]

これは次と同等です:

user> (vec (rest (list 1 2 3 4 5)))
=> [2 3 4 5]

あなたの場合、リストが(I K S I I)あり、それをとして評価したい(I (K (S (I (I)))))場合は、を使用(reduce comp ...)しますが、を使用することもできます(apply comp ...)

user> ((reduce comp [vec rest list]) 1 2 3 4 5)
=> [2 3 4 5]
user> ((apply comp [vec rest list]) 1 2 3 4 5)
=> [2 3 4 5]

->または->>マクロにも興味があるかもしれません。これらのマクロは、引数を次の引数に順番にネストします。->マクロは次の式の最初の位置にネストされますが、マクロ->>は次の式の最後の位置にネストされます。「次のもの」が関数の場合、どちらも同じように動作し、の式を形成し、(function nested-things-so-far)続行します。

本当に、例は最高です:

(-> 1 (+ 10) (- 100) inc)
;//Expands to...
(inc (- (+ 1 10) 100))
;//Evaluating in the REPL...
user> (-> 1 (+ 10) (- 100) inc)
=> -88

(->> 1 (+ 10) (- 100) inc)
;//Expands to...
(inc (- 100 (+ 10 1)))
;//Evaluating in the REPL...
user> (-> 1 (+ 10) (- 100) inc)
=> 90

ただ、オートカリー化をしたいと思っているようですが(やはり、よくわからないと思いますが)、既存の作り方はわかりません。

于 2012-08-12T00:55:33.173 に答える