18

私は 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))
4

3 に答える 3

12

特別なことではありません。気にしない名前を付けるための慣習にすぎませんが、それでも名前であり、通常の名前のように使用できます。

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

アップデート

これを行う:

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

エラーを生成しないため、好きなだけ _ を使用できます;)。

注: 上記は、Scheme や CL の場合とは異なります。

于 2013-04-15T16:35:24.177 に答える
0

以前の回答は良いですが、追加の説明が必要だったので、ここに私の回答があります。

(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 にバインドされ、'a' は 'last' にバインドされます。送信された以前の値はすべて無視/上書きされます。

于 2018-07-10T18:32:49.490 に答える