2013-04-15 20 views
12

Sto lavorando alla gioia del clojure e mi sto chiedendo cosa faccia la sintassi _ in un vettore di argomento delle funzioni.Clojure: cosa fa [_] in una lista di argomenti delle funzioni?

Esempio:

(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))))) 

Qual è il sottolineatura facendo nella forma:

#(dotimes [_ exec-count] (func)) 
+0

In Haskell, il _ denota qualcosa che non ti interessa davvero. Come un catch-all "qualsiasi cosa". Una sorta di variabile "qualunque cosa è qui". Interessato a vedere se è simile in clojure ... – Shark

risposta

13

Credo che il segno di sottolineatura venga utilizzato in Clojure, per convenzione, come segnaposto per un argomento obbligatorio ma non utilizzato. Come Keith Bennet mette:

In Clojure, la sottolineatura viene utilizzato idiomatica per indicare che l'argomento identifica non venga utilizzato successivamente.

Il vostro esempio è coerente con questo "uso", dal momento che il primo argomento di dotimes, che è un indicizzatore, non è necessario, ma il legame è richiesto dal modulo.

+1

Credo che questo derivi da haskell. –

+2

e haskell probabilmente l'ha preso dal prologo. Non sono sicuro di dove sia iniziato. – bmaddy

10

Niente di speciale a questo proposito, è solo una convenzione per la denominazione qualcosa che non si cura di, ma ancora è un nome e può essere usato come un nome normale.

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

UPDATE

Fare questo:

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

non produce un errore e, quindi, è possibile utilizzare come molti _ come si desidera;).

NOTA: Quanto sopra non è il caso con Scheme o CL ... Hmm qual è stato il razionale dietro in clojure allora ???

+0

Vuoi distinguere tra questo caso e il caso in cui il simbolo non è effettivamente utilizzato da nessuna parte ma richiesto per la firma? È così che l'ho capito. In altre parole, personalmente non ho usato '_' dove verrebbe effettivamente fatto riferimento. – harpo

+1

@harpo Per quanto riguarda il compilatore e il runtime Clojure, '_' è solo un simbolo ordinario senza semantica speciale. Per convenzione, gli sviluppatori Clojure usano '_' invece di qualcosa come' ignorato' o 'dont-care' perché' _' è più corto e ha un aspetto distintivo. Certo, sei libero di seguire la convenzione o no. Personalmente non lo userei come ha fatto l'esempio di Ankur; nel suo caso, il simbolo è effettivamente referenziato da qualche parte. – user100464

Problemi correlati