Question

J'essaie de comprendre la syntaxe d'appel pour utiliser pour charger une bibliothèque:

(use 'clojure.contrib.duck-streams)

Cela me semble logique car elle applique la macro de lecture de citation à clojure.contrib.duck-streams afin que le lecteur ne tente pas d'évaluer cette chaîne.

Maintenant, si je veux utiliser la balise: only pour charger uniquement le lecteur, pourquoi est-ce correct:

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

au lieu de:

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

Je lis ceci comme signifiant passer dans ce vecteur d’arguments à utiliser mais le REPL se plaint auprès de Je ne sais pas comment créer ISeq à partir de Symbol. Pourquoi les parens autour du lecteur?

Ceci est également équivalent à la première ligne et valide:

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

Il semble donc que 'string are' [string] sont des arguments équivalents que je ne comprends pas non plus.

Était-ce utile?

La solution

: seul souhaite une liste de symboles. C'est comme ça que la fonction est écrite. Notez la docstring pour refer , que utilise utilise.

 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

Il est écrit ainsi afin que vous puissiez spécifier plusieurs symboles si vous le souhaitez.

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

Comme indiqué dans cette publication récente , si vous écrivez une fonction qui prend ou retourne un nombre variable d’arguments, c’est une bonne idée qu’il prenne / retourne toujours une liste, un vecteur ou un ensemble, même s’il prend / retourne un seul élément. Parce que:

  • nil , souvent utilisé pour représenter les "éléments nuls", peut seq . Les collections vides peuvent également seq .
  • Deux ou plusieurs éléments d'une liste peuvent seq .
  • Cela n'a de sens que d'avoir un seul élément seq capable de le mettre en place dans une liste.

Il serait délicat d’avoir un cas particulier comme cas particulier. Il est plus cohérent et plus facile de programmer lorsque vous considérez un élément comme une sorte de cas dégénéré et le jettez dans une liste.

Notez que tout ce que utilise se préoccupe de savoir si l'argument : uniquement est une collection de symboles seqable. Cela signifie que les listes, les vecteurs et les ensembles fonctionnent.

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

Un seul symbole n'est cependant pas seq , c'est pourquoi vous obtenez l'exception que vous avez.

Regardez dans core.clj . si vous voulez voir comment tout cela est mis en œuvre.

Autres conseils

Celles-ci ne sont pas que des "parens" - Les parens sont la syntaxe pour créer une liste. Il semblerait que l'élément après la balise: only soit censé être une liste d'éléments auxquels il s'applique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top