在常见的LISP中,您可以做到这一点:
(defun foo (bar &key baz quux)
(list bar baz quux))
(foo 1 :quux 3 :baz 2) ; => (1 2 3)
cllojure没有关键字参数。 一种选择是:
(defn foo [bar {:keys [baz quux]}]
(list bar baz quux))
(foo 1 {:quux 3 :baz 2}) ; => (1 2 3)
嵌套的括号太多,不得不始终打字和阅读。 它还需要一个明确的哈希图作为参数而不是平面列表。
什么是看上去不介绍标点符号炸弹的关键字参数的最惯用性的等效物?
> (defn kwtest [x & e] (:foo (apply hash-map e)))
#'user/kwtest
> (kwtest 12 :bar "ignored" :foo "returned")
"returned"
相应的线程包含有关为什么Clojure不支持关键字参数的信息。基本上是为了避免运行时开销。 Rich解释了我上面显示的方法
最近的添加是clojure.contrib.def
宏,它可以通过关键字参数来定义函数(请参见here