2009-10-23 13 views
6

Estoy tratando de entender la sintaxis para llamar su uso para cargar una biblioteca:Clojure sintaxis argumento de la función

(use 'clojure.contrib.duck-streams) 

tiene sentido para mí, ya que se aplica la macro lector de cotización a clojure.contrib.duck-corrientes por lo que el lector no intenta evaluar esa cadena.

Ahora, si quiero usar el: única etiqueta a lector de carga solamente, ¿por qué es esto correcto:

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

en lugar de:

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

leí que esto significa pase en este vector de argumentos para usar pero REPL se queja con No sé cómo crear ISeq desde Symbol. ¿Por qué los paréntesis alrededor del lector?

Esto también es equivalente a la primera línea y válida:

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

lo que parece que 'cadena son' [cadena] son ​​argumentos equivalentes que no entiendo tampoco.

Respuesta

14

:only quiere una lista de símbolos. Así es como está escrita la función. Tenga en cuenta la 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 de esta manera para que pueda especificar más de un símbolo si lo desea.

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

Como se discutió en this recent post, si usted está escribiendo una función que toma o devuelve un número variable de argumentos, es una buena idea tener siempre toma/devolver una lista o vector o conjunto, incluso si es tomar/devolver un solo artículo. Porque:

  • nil, a menudo se utiliza para representar "cero puntos", es capaz seq. Las colecciones vacías también son seq habilitadas.
  • Dos o más elementos en una lista son seq capaz.
  • Tiene sentido también tener un elemento seq capaz de ponerlo en una lista.

Sería incómodo que el estuche de un artículo sea un caso especial. Es más consistente y más fácil programarlo cuando tratas un ítem como una especie de caso degenerado y lo incluyes en una lista.

Tenga en cuenta que todo use se preocupa por si el argumento :only es una colección de símbolos seqable. Eso significa listas, vectores y establece todo el trabajo.

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

Una sola Symbol sin embargo, no es capaz seq razón por la cual se obtiene la excepción que haces.

Busque en core.clj si desea ver cómo se implementa todo esto.

1

Esos no son solo "parens": los parens son la sintaxis para crear una lista. Aparecería el elemento después de que: se espera que la única etiqueta sea una lista de las cosas a las que se aplica.

Cuestiones relacionadas