Clojure关键字参数

在Common Lisp中,你可以这样做:

(defun foo (bar &key baz quux) (list bar baz quux)) (foo 1 :quux 3 :baz 2) ; => (1 2 3) 

Clojure没有关键字参数。 一个替代scheme是:

 (defn foo [bar {:keys [baz quux]}] (list bar baz quux)) (foo 1 {:quux 3 :baz 2}) ; => (1 2 3) 

这是太多的嵌套括号,必须键入和阅读所有的时间。 它还需要一个明确的哈希映射作为参数而不是平面列表传入。

关键字参数的最常用的Clojure等价物是什么,看起来没有人标点符号炸弹?

在clojure中模拟关键字参数的一个简单方法就是使用如下的rest参数的哈希映射:

 > (defn kwtest [x & e] (:foo (apply hash-map e))) #'user/kwtest > (kwtest 12 :bar "ignored" :foo "returned") "returned" 

Rich Hickey提供了一个来自clojure google组的消息的macros, 该组给出了关键字参数。 相应的线程包含关于为什么clojure不支持关键字参数的信息。 基本上要避免运行时间的开销。 Rich解释了这个消息中上面显示的方法

为了更新Clojure 1.2的这个答案,现在有了完整的关键字arg支持,这些支持由解构绑定的地graphics式提供的默认值:

 user> (defn foo [bar &{ :keys [baz quux] :or {baz "baz_default" quux "quux_default"}}] (list bar baz quux)) #'user/foo user> (foo 1 :quux 3) (1 "baz_default" 3) 

最近clojure.contrib.def一个补充是defnkmacros,它可以使用关键字参数来定义函数(参见这里 )。