2013-04-15 3 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

В Haskell символ _ означает то, что вам действительно неинтересно. Как уловка «все». Тип переменной «все, что здесь». Заинтересовано, если это похоже на clojure ... – 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)) 

не вызывает ошибку, и, следовательно, вы можете использовать столько, сколько _ как вы хотите;).

ПРИМЕЧАНИЕ: Вышеупомянутое не относится к Схеме или CL ... Хм, что было рациональным позади этого в clojure, то ???

+0

Не могли бы вы различить этот случай и случай, когда символ фактически не используется нигде, но требуется для подписи? Вот как я это понял. Другими словами, я лично не использовал '_', на котором он действительно ссылался бы. – harpo

+1

@harpo Что касается компилятора Clojure и времени выполнения, '_' является просто обычным символом без специальной семантики. По соглашению разработчики Clojure используют '_' вместо чего-то вроде' ignored' или 'dont-care', потому что' _' короче и выглядит отличительным. Конечно, вы свободны следовать конвенции или нет. Я лично не буду использовать его так, как это сделал пример Анкура; в его случае символ фактически упоминается где-то. – user100464