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中 ,关于如何使用解构来做这个更深入的解释。