2015-06-27 8 views
5

Co oznacza podkreślenie w wektorze wiążącym let, więc jeśli napiszę to, co to jest podkreślenie w miejscu słowa kluczowego?Jaki jest pożytek z podkreślenia w formie wiążącej Clojure?

+0

tutaj jest bardziej conceret przykład: 'user => (powiedzmy, [A (stosowanie 5 (zakres)) {: Klucze [BCD ]: lub {d 10 b 20 c 30}} {: c 50: d 100} [efg & h] ["a" "b" "c" "d" "e"] _ (println "Byłem tutaj! ") foo 12 bar (+ foo 100)] [a b c d e f g h foo bar]) Byłem tu! [(0 1 2 3 4) 20 50 100 "a" "b" "c" ("d" "e") 12 112] ' – amirteymuri

Odpowiedz

3

Podkreślenie jest uniwersalnym symbolem ignorowania.

Musi być zwrócona wartość dla każdego seksu w formularzu let, a println zwraca zero, więc możesz ustawić ją na _, aby powiedzieć ludziom, że ignorujesz powrót i po prostu robisz debugowanie w tym momencie. na przykład

(let [foo (+ 1 2) 
     _ (println "debug! foo is" foo) 
     _ (println "more debug!" (+ 1 foo)] 
    foo) 

każda ocena s-wyrażenie ustawia _ wartości zwracane, ale nie jest to konieczne, tak po prostu czytać je jako takie.

+0

świetnie, dziękuję. Czy to tylko ze względu na wypełnianie przestrzeni i debugowanie? - – amirteymuri

+0

Tak, tylko efekty uboczne –

+1

Uwaga dotycząca terminologii: _ nie jest wartością, jest symbolem. (class (quote _)) zwraca clojure.lang.Symbol Symbole muszą być cytowane lub otrzymują wartość eVALUE (klasa _) zwróci klasę wartości, do której aktualnie przypisane jest podkreślenie. – JBiserkov

11

podkreślenia jest poprawnym identyfikatorem symbol, jak widać przez ten przykładowy kod:

(let [_ 1] 
    (println _)) 
=> 1 

Umownie, gdy masz identyfikator nie będzie cię wykorzystuje może korzystanie _, ale to nie jest obowiązkowe.

Happens zarówno efektem ubocznym sytuacji jak w próbce (w przypadku linii println zwraca nil więc nie będzie wiążący swój wynik Symbol)

dzieje się również na sytuacji rozpad, gdzie nie potrzebuję niektórych wartości.

(let [[a _ _ d] [1 2 3 4]] 
    (println a)) 
=> 1 

W tym przypadku nie jesteś zainteresowany w 2. i 3. wartości, więc identyfikator _ jest idiomatyczne dla mówiąc nie obchodzi.

W zwykłym Clojure podkreślenie _ jest traktowane jak każdy inny symbol (np. "Śmieci"). Ma jednak szczególne znaczenie w niektórych bibliotekach. Na przykład w Datomic _ jest traktowany jak "wieloznacznik", który zapobiega wiązaniu/unifikacji. W clojure.core.match, _ jest również traktowany jako symbol wieloznaczny.

Zob

+0

świetnie, dziękuję. Czy to tylko ze względu na wypełnianie przestrzeni i debugowanie? – amirteymuri

+0

Myślę, że możesz tak powiedzieć –

Powiązane problemy