Function 制作一个将其参数作为:键传递给另一个函数的函数

Function 制作一个将其参数作为:键传递给另一个函数的函数,function,clojure,hashmap,Function,Clojure,Hashmap,我有一个函数,它的形式如下 (defn foo [& {:keys [x y z]}] ...) 我想创建一个函数,它只接受键y和z,但总是给x相同的值。我可以这样写 (defn bar [& {:keys [y z]}] (foo :x "blah" :y y :z z)) 我唯一的问题是我必须再次重复{:keys…}位,而实际的函数foo有更多的键,这在将来可能会改变。有什么方法可以让bar接受任何键值对,并将它们全部传递给foo,同时确保x保持不变吗?这可以工作

我有一个函数,它的形式如下

(defn foo [& {:keys [x y z]}]
  ...)
我想创建一个函数,它只接受键y和z,但总是给x相同的值。我可以这样写

(defn bar [& {:keys [y z]}]
  (foo :x "blah" :y y :z z))

我唯一的问题是我必须再次重复{:keys…}位,而实际的函数foo有更多的键,这在将来可能会改变。有什么方法可以让bar接受任何键值对,并将它们全部传递给foo,同时确保x保持不变吗?

这可以工作并覆盖传递给
bar的任何
:x
值:

(defn foo [& {:keys [ x y ]}]
   [x y])

(defn bar [ & args ]
   (apply foo (concat args [:x "blah"])))

当您使用与(&)符号时,您是在声明一个可变函数。 你可能不需要你的函数是可变的。 您可以简单地执行以下操作:

(defn foo [{:keys [x y z]}]
  [x y z])

(defn bar [{:keys [y z] :as args}]  
  (foo (assoc args :x "blah")))
您将使用如下映射调用
bar
(bar{:y20:z10})
。如果您确实需要
bar
作为可变函数,您可以这样做(
foo
与上面的相同):


您将继续这样调用
bar
(bar:y10:z20)
。您也可以使
foo
可变,但您必须使用类似
(展平(映射列表(键参数)(VAL参数)))
的东西重新创建参数列表。

您的函数需要可变吗?或者你只是想传递一张地图?它必须是可变的,我不想传递地图。不,我绝对需要它是可变的。实际的foo函数只是将值放入一个记录中,当函数运行时,其中一些值可能是
nil
。如果bar的参数已经包含:x值,这将是一个问题。这正是我所要求的。谢谢:)@mobyte当:x被赋予bar时,如果它只是抛出一个错误,实际上会更好,因为bar应该只需要一个:x值。
(defn bar [& {:keys [y z] :as args}]
   (foo (assoc args :x "blah"))
(defn bar [& {:keys [y z] :as args}]
  (apply foo (apply concat (assoc args :x "blah"))))