Pergunta
Eu estou tentando entender a sintaxe para chamar o uso para carregar uma biblioteca:
(use 'clojure.contrib.duck-streams)
Faz sentido para mim como se aplica a macro Citação leitor a clojure.contrib.duck-córregos para que o leitor não tenta avaliar essa string.
Agora, se eu quiser usar o: somente tag apenas leitor de carga, por que isso é correto:
(use '[clojure.contrib.duck-streams :only (reader)])
em vez de:
(use '[clojure.contrib.duck-streams :only reader])
Eu li isso a passagem média neste vector de argumentos de usar, mas o REPL reclama com não sei como criar ISEQ da Symbol. Por que os parênteses ao redor leitor?
Isso também é equivalente à primeira linha e válido:
(use '[clojure.contrib.duck-streams])
Assim, parece que 'string são' [cadeia] são argumentos equivalentes que eu também não entendo.
Solução
:only
quer uma lista de símbolos. Isso é apenas como a função é escrita. Observe a docstring para refer
, que usa 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
Está escrito dessa maneira para que você pode especificar mais de um símbolo, se quiser.
(use '[clojure.contrib.duck-streams :only (reader writer)])
Como discutido na este post recente , se você estiver escrevendo uma função que leva ou retorna um número variável de argumentos, é uma boa idéia para tê-lo sempre tomar / retornar uma lista, vetor ou conjunto, mesmo se ele está tomando / retornar um único item. Porque:
-
nil
, muitas vezes usado para representar "zero itens", éseq
able. coleções vazios também sãoseq
able. - Dois ou mais itens em uma lista são
seq
able. - Ela só faz sentido ter também um item ser
seq
able por colocá-lo em uma lista em si.
Seria estranho ter o caso de um item de ser um caso especial. É mais consistente e mais fácil de programar em torno de quando você trata de um item como uma espécie de caso degenerado e jogá-lo em uma lista.
Observe que todos os cuidados use
é se o argumento :only
é uma coleção seqable de símbolos. Isso significa listas, vetores e conjuntos de todo o trabalho.
(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])
A única Symbol
no entanto não é seq
able que é por isso que você começa a exceção que você faz.
core.clj se você quiser ver como tudo isto é implementado.
Outras dicas
Aqueles que não são apenas "parênteses" - parens são a sintaxe para a criação de uma lista. Parece o item após o:. Única marca é esperado para ser uma lista de coisas que se aplica a