2009-10-23 19 views
6

Próbuję zrozumieć składnię nazywając korzystanie załadować bibliotekę:Clojure składnia argumentu funkcja

(use 'clojure.contrib.duck-streams) 

sens dla mnie, ponieważ odnosi makro czytnika cytat do clojure.contrib.duck-strumienie tak że czytelnik nie próbuje ocenić tego ciągu.

Teraz, jeśli chcę użyć: Tag tylko do jedynego czytelnika obciążenia, dlaczego to jest poprawne:

(use '[clojure.contrib.duck-streams :only (reader)]) 

zamiast:

(use '[clojure.contrib.duck-streams :only reader]) 

czytam to oznaczać podanie w ten wektor argumentów do użycia, ale REPL narzeka z Nie wiem jak stworzyć ISeq z Symbol. Dlaczego pareny wokół czytnika?

Jest to również równoważne do pierwszej linii i ważne:

(use '[clojure.contrib.duck-streams]) 

Wygląda więc na to, że „ciąg są” [ciąg] są równoważne argumenty, które nie rozumieją, albo.

Odpowiedz

14

:only chce listę symboli. Tak właśnie jest pisana funkcja. Zwróć uwagę na docstring dla refer, który używa use.

refers to all public vars of ns, subject to filters. 
filters can include at most one each of: 

:exclude list-of-symbols 
:only list-of-symbols 
:rename map-of-fromsymbol-tosymbol 

Jest napisany w ten sposób, aby można było określić więcej niż jeden symbol, jeśli chcesz.

(use '[clojure.contrib.duck-streams :only (reader writer)]) 

Jak omówiono w this recent post, jeśli piszesz funkcję, która pobiera lub zwraca zmienną liczbę argumentów, że to dobry pomysł, aby mieć go zawsze zabrać/zwróci listę lub wektor lub ustaw, nawet jeśli jest to przyjęcie/zwrot pojedynczego przedmiotu. Ponieważ:

  • nil, często używany do reprezentowania "pozycji zerowych", jest seq stanie. Puste kolekcje są również w stanie.
  • Dostępne są dwie lub więcej pozycji na liście: seq.
  • Rozsądne jest również, aby jeden element można było ustawić jako samodzielną na liście.

Byłoby niezręcznie, gdyby sprawa z jednym elementem była sprawą specjalną. Jest bardziej spójny i łatwiejszy do zaprogramowania, gdy traktujesz jeden przedmiot jako rodzaj zdegenerowanego przypadku i umieszczasz go na liście.

Należy pamiętać, że wszystko, co dotyczy use, dotyczy tego, czy argument :only jest kolejnym zbiorem symboli. Oznacza to, że listy, wektory i zestawy działają.

(use '[clojure.contrib.duck-streams :only [reader writer]]) 
(use '[clojure.contrib.duck-streams :only #{reader writer}]) 

Pojedynczy Symbol jednak nie jest w stanie seq dlatego dostaniesz wyjątek ty.

Sprawdź w core.clj, jeśli chcesz zobaczyć, jak to wszystko zostało zaimplementowane.

1

To nie są tylko "pareny" - parens to składnia do tworzenia listy. Wygląda na to, że po tagu: only oczekuje się, że będzie to lista rzeczy, których dotyczy.

Powiązane problemy