2009-10-23 4 views
6

Я пытаюсь понять синтаксис для вызова использовать для загрузки библиотеки:Clojure аргумент функции Синтаксис

(use 'clojure.contrib.duck-streams) 

имеет смысл для меня, поскольку это относится к котировке читатель макрос clojure.contrib.duck-потоков так что читатель не пытается оценить эту строку.

Теперь, если я хочу использовать: только помечать только читателя нагрузки, почему это правильно:

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

вместо:

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

Я прочитал это означает пропуск в этом вектор аргументов для использования, но REPL жалуется на Не знаю, как создать ISeq из Symbol. Почему парсеры вокруг читателя?

Это также эквивалентно первой строке и действует:

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

Таким образом, кажется, что «строка являются» [строка] являются эквивалентными аргументы, которые я не понимаю, либо.

ответ

14

:only хочет получить список символов. Вот как написана функция. Обратите внимание на docstring для 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)]) 

Как обсуждалось в this recent post, если вы пишете функцию, которая принимает или возвращает переменное число аргументов, это хорошая идея, чтобы всегда принимать/возвращать список или вектор или набор, даже если это взятие/возвращение одного элемента. Потому что:

  • 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, если вы хотите увидеть, как все это реализовано.

1

Это не просто «parens» - синтаксис для создания списка. Он появится в элементе после: только тег, как ожидается, будет списком вещей, к которым он относится.

Смежные вопросы