次の答えは私の側の推測です:showusの実装を見てpartial
ください:
(defn partial
"Takes a function f and fewer than the normal arguments to f, and
returns a fn that takes a variable number of additional args. When
called, the returned function calls f with args + additional args."
{:added "1.0"
:static true}
([f arg1]
(fn [& args] (apply f arg1 args)))
([f arg1 arg2]
(fn [& args] (apply f arg1 arg2 args)))
([f arg1 arg2 arg3]
(fn [& args] (apply f arg1 arg2 arg3 args)))
([f arg1 arg2 arg3 & more]
(fn [& args] (apply f arg1 arg2 arg3 (concat more args)))))
ご覧のとおり、partialを呼び出すたびに同じことが行われます。つまり、いくつかの引数を受け入れる関数を返し、apply
入力引数と新しい引数を使用して入力関数を呼び出します。したがって、これは確かにとして記述されている可能性がありますarg1 & more
。しかし、待ってください。applyの実装も見てみましょう。
(defn apply
"Applies fn f to the argument list formed by prepending intervening arguments to args."
{:added "1.0"
:static true}
([^clojure.lang.IFn f args]
(. f (applyTo (seq args))))
([^clojure.lang.IFn f x args]
(. f (applyTo (list* x args))))
([^clojure.lang.IFn f x y args]
(. f (applyTo (list* x y args))))
([^clojure.lang.IFn f x y z args]
(. f (applyTo (list* x y z args))))
([^clojure.lang.IFn f a b c d & args]
(. f (applyTo (cons a (cons b (cons c (cons d (spread args)))))))))
Applyはコア関数であり、引数の数が異なると実行方法も異なります。これは、パフォーマンス上の理由から適用するための最適化です。これが、部分的な(および他のそのような関数)のさまざまなアリティを公開する理由です。これは、コードの内部実行がさまざまなアリティで異なるためです。
clojure /コアチームは、arg1 arg2 arg3以上を超えて部分的なアリティを公開すること(つまり、arg1 arg2 arg3 arg4以上を書くこと)は美的ではないと考えたので、3arg以上で停止することにしました。