带有关键字参数的变量函数

iza*_*ban 8 clojure variadic-functions keyword

我是Clojure的新手,我想知道是否有办法定义一个可以这样调用的函数:

(strange-adder 1 2 3 :strange true)
Run Code Online (Sandbox Code Playgroud)

也就是说,一个可以接收可变数量的int和关键字参数的函数.

我知道我可以用这种方式用关键字参数定义一个函数:

(defn strange-adder
  [a b c & {:keys [strange]}]
  (println strange)
  (+ a b c))
Run Code Online (Sandbox Code Playgroud)

但是现在我的功能只能接收固定数量的整数.

有没有办法同时使用这两种风格?

Art*_*ldt 10

很不幸的是,不行.

&参数列表上后,拆解运营商使用一切,所以它并没有处理两个diferent套可变元数解构群体的一种形式的能力.

一种选择是将功能分解为几个arities.虽然这只有你可以安排它才有效,所以其中只有一个是可变的(使用&).更通用且不太方便的解决方案是将整个参数列表视为一个可变参数形式,并从手动开始选择数字.

user> (defn strange-adder
        [& args]
         (let [nums (take-while number? args)
               opts (apply hash-map (drop-while number? args))
               strange (:strange opts)]
          (println strange)
              (apply + nums)))
#'user/strange-adder
user> (strange-adder 1 2 3 4 :strange 4)
4
10
Run Code Online (Sandbox Code Playgroud)