2013-04-15 19 views
12

私はclojureの喜びを味わい、_構文が関数の引数ベクトルで何をするのか疑問に思っています。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)) 
+0

ハスケルでは、_はあなたが本当に気にしないことを示しています。キャッチオール「何か」のように。 「ここにあるもの」変数の並べ替え。クロージャーで似ているかどうか確認してください... – Shark

答えて

13

Clojureでは、必須ではあるが使用されていない引数のプレースホルダーとして、慣例によりアンダースコアが使用されていると思います。 Keith Bennetがそれを置くよう:Clojureので

を、アンダースコアは、それが識別 引数がその後に使用されていないことを示すために慣用的に使用されています。

あなたの例では、インデクサですdotimesへの最初の引数は、必要とされていないので、この「利用」と一致しているが、結合は、フォームで必要とされます。

+1

私はこれがhaskellに由来すると信じています。 –

+2

とhaskellはおそらくプロローグからそれを得ました。私はそれがどこから始まったのか分からない。 – bmaddy

10

何も特別な、それは、あなたが気にしない何かに名前を付けるためだけの規約ですそれはまだ名前であり、通常の名前のように使用することができます。これを行う

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

UPDATE

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

がエラーを生成しませんし、あなたが望むようので、あなたは_できるだけ多くを使用することができます。)。

注:上記はSchemeまたはCLのケースではありません...うーん、clojureでそれの背後にある合理的なものは何ですか?

+0

このケースと、シンボルが実際にどこでも使用されていないのに署名に必要な場合を区別しますか?それが私がそれを理解した方法です。言い換えれば、私は個人的に実際に参照される場所に '_ 'を使用していません。 – harpo

+1

@harpo Clojureコンパイラとランタイムに関する限り、 '_'は特別なセマンティクスのない普通のシンボルです。慣例により、Clojureの開発者は 'ignored'や' dont-care'のようなものの代わりに '_'を使用します。なぜなら、' _'はより短くて目立つように見えるからです。もちろん、大会に従うかどうかは自由です。私は個人的にはそれをAnkurの例のように使用しません。彼の場合、シンボルは実際にどこかで参照されています。 – user100464

関連する問題