私はClojureを学んでおり、可変数のパラメータ(variadic関数)を取り、それらを合計する関数を定義しようとしています(うん、+プロシージャのように)。しかし、私はそのような機能を実装する方法を知りません
私にできることはすべて:
(defn sum [n1, n2] (+ n1 n2))
もちろん、この関数は2つのパラメーターと2つのパラメーターのみを取ります。未定義の数のパラメーターを受け入れる(および処理する)方法を教えてください。
一般的に、非可換の場合は apply を使用できます:
(defn sum [& args] (apply + args))
加算は可換なので、次のようなものも動作するはずです。
(defn sum [& args] (reduce + args))
&
は、args
を引数リストの残りの部分にバインドします(この場合、&
の左側には何もないため、リスト全体)。
明らかにそのような合計を定義することは意味がありません。
(sum a b c d e ...)
あなたは書くことができます:
(+ a b c d e ....)
Yehoanathanはアリティのオーバーロードについて言及していますが、直接的な例を提供していません。彼が話していることは次のとおりです。
(defn special-sum
([] (+ 10 10))
([x] (+ 10 x))
([x y] (+ x y)))
(special-sum)
=> 20
(special-sum 50)
=> 60
(special-sum 50 25)
=> 75
(defn my-sum
([] 0) ; no parameter
([x] x) ; one parameter
([x y] (+ x y)) ; two parameters
([x y & more] ; more than two parameters
(reduce + (my-sum x y) more))
)
defn
は、関数の定義を少し簡単にするマクロです。 Clojureは、単一の関数オブジェクト、自己参照、および&
(defn sum [& args]
(print "sum of" args ":" (apply + args)))
これは、任意の数の引数を取り、それらを加算します。