Sintassi dell'argomento della funzione Clojure
-
06-07-2019 - |
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.
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 sonoseq
- 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.