正如您所描述的,我不知道如何做到这一点,但是根据您想要做的事情,有一些选择。
如果您想确保仅使用两个参数调用该函数,请考虑一个先决条件:
(defn fx [& args]
{:pre [(= 2 (count args))]}
args)
user=> (fx 1 2)
(1 2)
user=> (fx 1 2 3)
AssertionError Assert failed: (= 2 (count args)) user/fx (NO_SOURCE_FILE:1)
如果您想跟踪函数的预期数量,但仍然可以访问所有 args 的向量,您可以添加自己的元数据:
(defn
^{:my.ns/arglists '([{:keys [a]} b])}
fx [& args]
args)
user=> (fx 1 2)
(1 2)
user=> (-> #'fx meta :my.ns/arglists first)
[{:keys [a]} b]
如果您只想访问您描述的解构值并访问 args 值,您可以使用 let:
(defn fx [{:keys [a]} b]
(let [args [{:a a} b]]
[a b args]))
user=> (fx {:a 1 :c 3} 2)
[1 2 [{:a 1} 2]]
user=> (fx {:a 1 :c 3} 2 4)
ArityException Wrong number of args (3) passed to: user$fx clojure.lang.AFn.throwArity (AFn.java:437)
你也可以做这些的组合。