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))
Ответы
Ответ 1
Я считаю, что подчеркивание используется в Clojure, по соглашению, в качестве заполнителя для требуемого, но неиспользуемого аргумента. Как Кейт Беннет говорит:
В Clojure подчеркивание используется идиоматически, чтобы указать, что аргумент, который он идентифицирует, впоследствии не используется.
Ваш пример согласуется с этим "использованием", поскольку первый аргумент dotimes
, который является индексом, не нужен, но привязка требуется формой.
Ответ 2
Ничего особенного в этом нет, это просто соглашение о том, чтобы называть то, что вам неинтересно, но все же это имя и может использоваться как обычное имя.
(defn hello [_] (+ 1 _))
(hello 10)
UPDATE
Выполнение этого действия:
(defn hello [a a] (+ a a))
не создает ошибку и, следовательно, вы можете использовать столько _, сколько хотите;).
ПРИМЕЧАНИЕ. Вышеупомянутое не относится к Схеме или CL... Хм, что было рациональным позади этого в clojure, тогда???