Domanda

Sto cercando di capire la sintassi per chiamare l'uso per caricare una libreria:

(use 'clojure.contrib.duck-streams)

Per me ha senso in quanto applica la macro del lettore di virgolette a clojure.contrib.duck-streams in modo che il lettore non tenti di valutare quella stringa.

Ora, se voglio usare il tag: only per caricare solo reader, perché è corretto:

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

anziché:

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

Ho letto questo per significare passare in questo vettore di argomenti da usare, ma REPL si lamenta Non so come creare ISeq da Symbol. Perché i genitori attorno al lettore?

Questo equivale anche alla prima riga e valido:

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

Quindi sembra che 'string are' [string] siano argomenti equivalenti che neanche io capisco.

È stato utile?

Soluzione

: only desidera un elenco di simboli. Ecco come è scritta la funzione. Nota la documentazione per refer , che usa usa.

 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

È scritto in questo modo in modo da poter specificare più di un simbolo se lo si desidera.

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

Come discusso in questo post recente , se stai scrivendo una funzione che accetta o restituisce un numero variabile di argomenti, è una buona idea avere sempre prendere / restituire un elenco, un vettore o un set, anche se sta prendendo / restituendo un singolo elemento. Perché:

  • zero , spesso usato per rappresentare " zero articoli " ;, è seq in grado. Anche le raccolte vuote sono seq
  • Due o più elementi in un elenco sono seq in grado.
  • Ha senso avere anche un solo elemento seq inserendolo in un elenco stesso.

Sarebbe imbarazzante che il caso di un oggetto sia un caso speciale. È più coerente e più facile da programmare quando tratti un oggetto come una specie di caso degenerato e lo butti in un elenco.

Nota che tutto ciò che interessa a use è se l'argomento : only è una raccolta seqable di simboli. Ciò significa che elenchi, vettori e set funzionano tutti.

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

Un singolo Symbol tuttavia non è seq ed è per questo che ottieni l'eccezione che fai.

Cerca core.clj se vuoi vedere come tutto questo è implementato.

Altri suggerimenti

Quelli non sono solo " parentesi " - i parentesi sono la sintassi per la creazione di un elenco. Apparirà l'elemento dopo il: solo il tag dovrebbe essere un elenco di cose a cui si applica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top