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
一个补充是defnk
macros,它可以使用关键字参数来定义函数(参见这里 )。