2013-04-15 6 views
12

Pracuję poprzez radość z clojure i zastanawiam się, co robi składnia _ w wektorze argumentów funkcji.Clojure: Co robi [_] na liście argumentów funkcji?

Przykład:

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

Co jest podkreślenia robi w formie:

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

W języku Haskell _ oznacza coś, na co naprawdę nie zależy. Jak złapać wszystko "coś". Rodzaj zmiennej "cokolwiek jest tutaj". Interesuje Cię, czy to jest podobne w clojure ... – Shark

Odpowiedz

13

Uważam, że podkreślenie jest stosowane w konwencji Clojure, zgodnie z konwencją, jako symbol zastępczy dla wymaganego, ale niewykorzystanego argumentu. Jak Keith Bennet stawia go:

W Clojure, podkreślenia służy idiomatically aby wskazać, że argumentem identyfikuje nie jest następnie wykorzystywany.

Twój przykład jest zgodny z tym „użytkowania”, ponieważ pierwszy argument dotimes, który jest podziałowe, nie jest potrzebna, ale wiązanie jest wymagane przez formularz.

+1

Wierzę, że to pochodzi od haskell. –

+2

i haskell prawdopodobnie dostał go z prologu. Nie jestem pewien, gdzie to się zaczęło. – bmaddy

10

nic specjalnego, to tylko konwencja nazewnictwa coś, czego nie obchodzi, ale nadal jest to imię i może być używane jak zwykłe imię.

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

UPDATE

ten sposób:

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

nie produkuje błąd i stąd można wykorzystać jako wiele _ jak chcesz;).

UWAGA: Powyższe nie ma miejsca w przypadku schematu lub CL ... Hmm, co było za tym racjonalne w clojure?

+0

Czy rozróżniałbyś ten przypadek od przypadku, w którym symbol faktycznie nie jest używany, ale wymagany do podpisu? Tak to zrozumiałem. Innymi słowy, ja osobiście nie użyłem słowa "_" tam, gdzie w rzeczywistości można się do niego odwoływać. – harpo

+1

@harpo Jeśli chodzi o kompilator i środowisko wykonawcze Clojure, '_' jest zwykłym symbolem bez specjalnej semantyki. Zgodnie z konwencją programiści Clojure używają '_' zamiast czegoś takiego jak' ignored' lub 'dont-care', ponieważ' _' jest krótszy i wygląda charakterystycznie. Oczywiście możesz podążać za konwencją, czy nie. Osobiście nie użyłbym go tak, jak zrobił to przykład Ankur; w jego przypadku symbol jest w rzeczywistości gdzieś odwoływany. – user100464