Clojure:[_]在函数参数列表中做了什么?

时间:2013-04-15 16:32:25

标签: syntax vector clojure arguments

我正在研究clojure的乐趣,并想知道_语法在函数参数向量中的作用。

示例:

(def available-processors
    (.availableProcessors (Runtime/getRuntime)))

(prn "available processors: " available-processors)

(def pool
    (Executors/newFixedThreadPool (+ 2 available-processors)))

(defn dothreads!
    [func & {thread-count :threads exec-count :times :or {thread-count 1 exec-count 1}}]
    (dotimes [t thread-count]
        (.submit pool #(dotimes [_ exec-count] (func)))))

表格中的下划线是什么:

#(dotimes [_ exec-count] (func))

3 个答案:

答案 0 :(得分:17)

我认为按照惯例,在Clojure中使用下划线作为必需但未使用的参数的占位符。正如Keith Bennet所说:

  

在Clojure中,下划线用于表示   它标识的参数随后未被使用。

你的例子符合这个"用法,"因为dotimes的第一个参数是一个索引器,所以不需要,但表单需要绑定。

答案 1 :(得分:12)

没有什么特别的,它只是一个命名你不关心的东西的约定,但它仍然是一个名字,可以像普通名字一样使用。

(defn hello [_] (+ 1 _))
(hello 10)

<强>更新

这样做:

(defn hello [a a]  (+ a a))

不会产生错误,因此您可以根据需要使用多个_。)。

注意:上面不是Scheme或CL的情况......那么在clojure背后的理性是什么呢?

答案 2 :(得分:0)

以前的答案很好,但是由于我需要进一步澄清,所以这是我的答案。

java.lang.IllegalStateException: No instance for key AttributeKey: userK

相同
(defn blah[_] (str "the value you sent is " _)

没有区别。 _只是一种让查看代码的人知道不打算使用该参数的方法。

例如,这在编程上很好:

(defn blah[my-arg] (str "the value you sent is " my-arg)

但是看代码的人会认为您不打算使用_。因此,为了清楚起见,最好使用'n'或'ind'或其他名称而不是_。如果您不使用该值,如下所示...

(dotimes [_ 5] (println (str "I'm going to print this 5 times, and this is index # " _)))

然后将其绑定到_,因为这表明您没有使用它。

还有最后一件事,如果绑定具有相同的名称,则最后一个赢。因此,以下将打印“ 4last4last4last4last”。

(dotimes [_ 5] (println "I'm going to print this 5 times"))

因此在println块中,“ _”绑定到4,而“ a”绑定到“ last”。先前发送的所有值都会被忽略/覆盖。