Pregunta

Estoy tratando de entender la sintaxis del uso de llamadas para cargar una biblioteca:

(use 'clojure.contrib.duck-streams)

Tiene sentido para mí, ya que aplica la macro del lector de citas a clojure.contrib.duck-streams para que el lector no intente evaluar esa cadena.

Ahora, si quiero usar la etiqueta: only para cargar solo el lector, ¿por qué esto es correcto?

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

en lugar de:

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

Leí esto para significar pasar en este vector de argumentos para usar, pero el REPL se queja con No sé cómo crear ISeq desde Symbol. ¿Por qué los parens alrededor del lector?

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

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

Parece que "string are" [string] son ??argumentos equivalentes que tampoco entiendo.

¿Fue útil?

Solución

: only quiere una lista de símbolos. Así es como se escribe la función. Tenga en cuenta la cadena de documentos para referir , que utiliza utiliza.

 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 explica en esta publicación reciente , si está escribiendo una función que toma o devuelve un número variable de argumentos, es una buena idea que siempre tome / devuelva una lista o un vector o conjunto, incluso si está tomando / devolviendo un solo elemento. Porque:

  • nil , que a menudo se usa para representar "cero artículos", es seq capaz. Las colecciones vacías también son seq capaces.
  • Dos o más elementos en una lista son seq capaces.
  • Solo tiene sentido que un elemento sea seq capaz de ponerlo en una lista.

Sería incómodo que el caso de un solo artículo sea un caso especial. Es más consistente y más fácil de programar cuando trata un artículo como una especie de caso degenerado y lo pone en una lista.

Tenga en cuenta que todo lo que use le importa es si el argumento : only es una colección de símbolos que se puede buscar. Eso significa que las listas, vectores y conjuntos de todo el trabajo.

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

Un único Símbolo sin embargo no es seq , por lo que obtienes la excepción que obtienes.

Busque en core.clj Si quieres ver cómo se implementa todo esto.

Otros consejos

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top