有谁知道在Clojure中提供关键字参数的好方法?

时间:2011-01-04 12:02:47

标签: clojure

我希望能够使用如下关键字参数调用clojure函数:

(do-something :arg1 1 :arg2 "Hello")

:这是否可行而不必:

(do-something {:arg1 1 :arg2 "Hello"})

:我还可以使用:pre pre-conditions来提供somse类型的验证,以确保包含所有参数吗?

2 个答案:

答案 0 :(得分:5)

关键词args是由rest args的内置解构提供的(尽管main docs for destructuring遗憾地没有涵盖1.2中的这个添加:

(defn foo
  [a b & {:keys [c d]}]
  [a b c d])
#'user/foo
(foo 1 2 :c 12 :d [1])
[1 2 12 [1]]

所有常用的地图解构工具都可用(例如:or:strs:syms等。

答案 1 :(得分:3)

如果您想要关键字args的默认值,请执行以下操作(Clojure 1.2):

(defn foo
  [req1 req2 & {:keys [opt1 opt2] :or {opt1 :hello opt2 :goodbye}}]
  [req1 req2 opt1 opt2])
#'user/foo
user=> (foo :a :b)
[:a :b :hello :goodbye]
user=> (foo :a :b :opt1 "xyz")
[:a :b "xyz" :goodbye]