我希望能够使用如下关键字参数调用clojure函数:
(do-something :arg1 1 :arg2 "Hello")
:这是否可行而不必:
(do-something {:arg1 1 :arg2 "Hello"})
:我还可以使用:pre pre-conditions来提供somse类型的验证,以确保包含所有参数吗?
答案 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]