cllojure关键字参数

问题描述 投票:0回答:3

在常见的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)
嵌套的括号太多,不得不始终打字和阅读。  它还需要一个明确的哈希图作为参数而不是平面列表。  

什么是看上去不介绍标点符号炸弹的关键字参数的最惯用性的等效物?

binding clojure lisp common-lisp params-keyword
3个回答
102
投票
要更新Clojure 1.2的答案,现在有完整的关键字ARG支持,其默认形式由distructive binding binting

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)



39
投票

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

rich hickey在clojure google组中提供了this消息中的宏,为您提供关键字参数。
相应的线程
包含有关为什么Clojure不支持关键字参数的信息。基本上是为了避免运行时开销。 Rich解释了我上面显示的方法

最近的添加是clojure.contrib.def宏,它可以通过关键字参数来定义函数(请参见here

)。

9
投票

© www.soinside.com 2019 - 2025. All rights reserved.