Clojure的:这是什么[_]做一个函数的参数列表?(Clojure: What does [_]

2019-08-31 06:20发布

我通过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))

Answer 1:

我相信,下划线Clojure中使用,按照惯例,作为一个必需的,但是未使用的参数的占位符。 由于基思班纳特所说的那样:

Clojure中,下划线也被习惯用于指示它标识参数不随后使用。

你举的例子是与此一致“用法”,因为第一个参数dotimes是不需要的,这是一个索引,而是由表单所需的结合。



Answer 2:

什么特别的地方,它仅仅是命名的东西,你不关心的公约,但它仍然是一个名称,可以像一个正常的名称中使用。

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

UPDATE

这样做:

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

不会产生误差,因此,只要你想,你可以使用尽可能多的_)。

注:以上不符合计划或CL的情况......嗯什么用Clojure那么它背后的理性???



Answer 3:

以前的答案是好的,但因为我需要一些额外的澄清,这是我的答案。

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

是相同的

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

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

因此,例如,这是好的编程:

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

但有人看代码会觉得你是不是在使用_规划。 因此,这将更好地使用“n”或“IND”或什么的,而不是_,仅仅是明确的。 如果您没有使用该值,如下面...

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

然后,它因为你的参数绑定到_,因为你是表明你不使用它。

还有最后一两件事,如果绑定具有相同的名称,最后一个获胜。 所以下面将打印“4last4last4last4last”。

(defn will-print [_ a _ a _ a _ a] (println (str _ a _ a _ a _ a)))
(will-print 1 "a" 2 "b" 3 "c" 4 "last")

因此,在中的println块“_”势必4,和“一”必然“最后”。 所有发送的先前的值被忽略/覆盖。



文章来源: Clojure: What does [_] do in a Functions Argument List?