我希望能够像这样使用关键字参数来调用Clojure函数:
(do-something :arg1 1 :arg2 "Hello")
没有必要执行以下操作,这是否可行:
(do-something {:arg1 1 :arg2 "Hello"})
我可以使用 :pre 预设条件来提供某种验证以确保所有参数都被包括在内吗?
我希望能够像这样使用关键字参数来调用Clojure函数:
(do-something :arg1 1 :arg2 "Hello")
没有必要执行以下操作,这是否可行:
(do-something {:arg1 1 :arg2 "Hello"})
我可以使用 :pre 预设条件来提供某种验证以确保所有参数都被包括在内吗?
关键字参数是通过rest参数的内置解构提供的(虽然在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
等)。
(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]
:or
是可选的。如果没有提供它,那么如果缺少参数,它们将获得null值:(defn foo [req1 req2 & {:keys [opt1 opt2]}] [req1 req2 opt1 opt2]) (foo :a :b) => [:a :b nil nil]
- Ralph