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.

Foi útil?

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", é seqable. coleções vazios também são seqable.
  • Dois ou mais itens em uma lista são seqable.
  • Ela só faz sentido ter também um item ser seqable 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 é seqable 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top