Clojure命名的参数
Clojure有没有命名的观点? 如果是这样,请你提供一个小例子吗?
在Clojure 1.2中,你可以像解构一个地图一样解构rest
参数。 这意味着您可以执行命名的非定位关键字参数。 这里是一个例子:
user> (defn blah [& {:keys [key1 key2 key3]}] (str key1 key2 key3)) #'user/blah user> (blah :key1 "Hai" :key2 " there" :key3 10) "Hai there10" user> (blah :key1 "Hai" :key2 " there") "Hai there" user> (defn blah [& {:keys [key1 key2 key3] :as everything}] everything) #'user/blah user> (blah :key1 "Hai" :key2 " there") {:key2 " there", :key1 "Hai"}
解构一个Clojure地图的任何事情都可以在函数的参数列表中完成,如上所示。 包括使用:或者为这样的参数定义默认值:
user> (defn blah [& {:keys [key1 key2 key3] :or {key3 10}}] (str key1 key2 key3)) #'user/blah user> (blah :key1 "Hai" :key2 " there") "Hai there10"
但是这是在Clojure 1.2中。 或者,在旧版本中,您可以这样做来模拟相同的事情:
user> (defn blah [& rest] (let [{:keys [key1 key2 key3] :or {key3 10}} (apply hash-map rest)] (str key1 key2 key3))) #'user/blah user> (blah :key1 "Hai" :key2 " there") "Hai there10"
而且工作原理基本相同。
您也可以在关键字参数之前有位置参数:
user> (defn blah [xy & {:keys [key1 key2 key3] :or {key3 10}}] (str xy key1 key2 key3)) #'user/blah user> (blah "x" "Y" :key1 "Hai" :key2 " there") "xYHai there10"
这些不是可选的,必须提供。
你可以像其他Clojure集合一样解构rest
参数。
user> (defn blah [& [one two & more]] (str one two "and the rest: " more)) #'user/blah user> (blah 1 2 "ressssssst") "12and the rest: (\"ressssssst\")"
你甚至可以在Clojure 1.1中做这样的事情。 关键字参数的地图样式解构仅在1.2版本中出现。
除了Raynes的优秀答案之外,还有一个clojure-contrib中的macros使生活更轻松:
user =>(使用'[clojure.contrib.def:只有[defnk]]) 零 user =>(defnk foo [ab:c 8:d 9] [A B C D]) #'用户/富 user =>(foo 1 2) [1 2 8 9] user =>(foo 1 2 3) java.lang.IllegalArgumentException:没有为键提供值:3(NO_SOURCE_FILE:0) user =>(foo 1 2:c 3) [1 2 3 9]
你可能是指名称参数 ? 这些不是直接可用的,但是如果你愿意的话,你可以使用这个向量的方法 ,这可能会给你你想要的。
在RosettaCode中 ,关于如何使用解构来做这个更深入的解释。