:only
хочет список символов. Вот как написана функция. Обратите внимание на строку документации для refer
, которую использует 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
Это написано так, что вы можете указать более одного символа, если хотите.
(use '[clojure.contrib.duck-streams :only (reader writer)])
Как обсуждалось в этом недавнем посте , если вы пишете функцию, которая принимает или возвращает переменное число аргументов, было бы неплохо, чтобы она всегда брала / возвращала список, вектор или набор , даже если он забирает / возвращает один предмет. Потому что:
nil
, часто используемый для обозначения «нулевых предметов», способен seq
. Пустые коллекции также могут seq
.
- Два или более элемента в списке могут
seq
.
- Имеет смысл только иметь один элемент, способный
seq
, поместить его в список.
Было бы неловко, чтобы случай с одним предметом был особым случаем. Это более согласованно и проще для программирования, когда вы рассматриваете один элемент как некий вырожденный случай и выбрасываете его в список.
Обратите внимание, что все, что волнует use
, это то, является ли аргумент :only
последовательной коллекцией символов. Это означает, что списки, векторы и множества все работают.
(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])
Один Symbol
, однако, не может seq
, поэтому вы получаете исключение, которое вы делаете.
Посмотрите в core.clj , если хотите увидеть, как все это реализовано.