2012-05-30 14 views
16

Estoy teniendo dificultades para entender (y por lo tanto recordar) el clojure requiere la sintaxis que se describe aquí: http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require. Parece contradictorio y no uniforme.clojure requieren sintaxis razonamiento

Por ejemplo, en lo que sigue por qué es este vector requerido para ser citado:

(require '[clj-json.core :as json]) 

contra intuitivo porque normalmente los vectores no están expresados ​​en clojure (listas se citan y vectores son tratados como datos).

Y no uniforme porque en este caso el vector no se cita:

(ns xxx 
    (:require [clj-json.core :as json])) 

que se dan cuenta de que la función de requerir el uso y :require dentro de la macro ns sólo son ópticamente similares, pero aún así.

Hay otras piezas de rarezas, así, por ejemplo, yo puedo hacer esto:

(require '(clj-json.core)) 

Pero no puedo hacer esto:

(require '(clj-json.core :as json)) 

Puede alguien responder a estas preguntas:

  1. en el primer ejemplo ¿por qué el vector debe ser cotizado?
  2. ¿por qué no necesita ser citado en la macro ns?
  3. ¿por qué la notación de la lista no permite :as?

Me pregunto si hay razones por las que las cosas son como son, o si la inconsistencia simplemente no se notó en el momento del diseño.

+0

Salida [este hilo] (https://groups.google.com/forum/?fromgroups#!searchin/clojure-dev/ns$20macro/clojure-dev/6EEfdPhrWgk/qJALczHTzpkJ) en el clojure -dev list si aún no lo has visto. Lo encontré bastante informativo. – Jeremy

Respuesta

11
  1. en el primer ejemplo ¿por qué el vector debe ser cotizado?

require es una función, por lo que debe citarlas para evitar su evaluación. De lo contrario, esos símbolos se buscarán en el contexto actual, lo que probablemente genere un error o un comportamiento inesperado. Por cierto, creo que esto no es del todo correcto: "Counter intuitivo porque normalmente los vectores no se citan en clojure (las listas se citan y los vectores se tratan como datos)".

Puede ser contra intuitivo para usted, sin embargo, no hay nada de malo en citar vectores (o mapas o conjuntos). Hago a menudo cuando se prueba algo rápidamente en el REPL, y no quiero escribir un : para cada palabra clave en un mapa o vector, por ejemplo:

user=> '{a 1 b 2 c 3} 

en lugar de:

user=> {:a 1 :b 2 :c 3} 

El primero es muy marginalmente más rápido escribir si solo quiero obtener rápidamente algunos datos para probar algo.

  1. ¿por qué no necesita ser citado en la macro ns?

macros no evalúan sus argumentos, que son una especie de perezoso que las llamadas a funciones normales, por lo que los símbolos (clj-json.core y json) no es necesario que se citan para prevenir evaluación.

  1. ¿por qué la notación de la lista no permite: como?

Lo siento, no sé la respuesta a esto.

Ah, eché un vistazo a los documentos para require y descubrí. Hay otra forma compatible:

"Lo siguiente cargaría las bibliotecas clojure.zip y clojure.set abreviadas como 's'."

(require '(clojure zip [set :as s])) 
+3

ok, así que me di cuenta (después de su explicación) que '(requiere ['clj-json.core: as' json])' funciona (vector sin comillas) pero requiere citar dos veces en lugar de una (probablemente por qué se prefiere el vector citado) . El mundo solo necesita tener sentido y luego puedo aceptarlo. – Kevin

+0

Sí, en realidad estaba a punto de editar o comentar con ese ejemplo pensando que podría ser útil. ¿Algo todavía no tiene sentido? – spacemanaki

+0

con el último ejemplo ¿por qué no permitir '(require '(clj-json.core: as json))'? Supongo que permitir eso haría que alguna otra forma aceptada sea ambigua o algo ... – Kevin

Cuestiones relacionadas