Подтвердить что ты не робот

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))
4b9b3361

Ответ 1

Я считаю, что подчеркивание используется в Clojure, по соглашению, в качестве заполнителя для требуемого, но неиспользуемого аргумента. Как Кейт Беннет говорит:

В Clojure подчеркивание используется идиоматически, чтобы указать, что аргумент, который он идентифицирует, впоследствии не используется.

Ваш пример согласуется с этим "использованием", поскольку первый аргумент dotimes, который является индексом, не нужен, но привязка требуется формой.

Ответ 2

Ничего особенного в этом нет, это просто соглашение о том, чтобы называть то, что вам неинтересно, но все же это имя и может использоваться как обычное имя.

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

UPDATE

Выполнение этого действия:

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

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

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