Синтаксис аргумента закрывающей функции - PullRequest
6 голосов
/ 23 октября 2009

Я пытаюсь понять синтаксис вызова use для загрузки библиотеки:

(use 'clojure.contrib.duck-streams)

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

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

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

вместо:

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

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

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

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

Так что кажется, что 'string are' [string] являются эквивалентными аргументами, которые я тоже не понимаю.

Ответы [ 2 ]

14 голосов
/ 23 октября 2009

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

1 голос
/ 23 октября 2009

Это не просто "parens" - это синтаксис для создания списка. Элемент после тега: only, как ожидается, будет списком элементов, к которым он применяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...