syntax - guides - clojure requiere razon de sintaxis
clojure guides (1)
- en el primer ejemplo, ¿por qué es necesario citar el vector?
require
es una función, por lo que debe citarlos para evitar la evaluación. De lo contrario, esos símbolos se buscarán en el contexto actual, lo que probablemente generará un error o un comportamiento inesperado. Por cierto, creo que esto no es del todo correcto: "Contra 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). A menudo hago pruebas rápidas en el REPL y no quiero escribir a :
para cada palabra clave en un mapa o vector, por ejemplo:
user=> ''{a 1 b 2 c 3}
más bien que:
user=> {:a 1 :b 2 :c 3}
El primero es ligeramente más rápido de escribir si solo quiero obtener rápidamente algunos datos para probar algo.
- ¿Por qué no necesita ser citado en la macro ns?
Las macros no evalúan sus argumentos, son más perezosas que las llamadas de función normales, por lo que los símbolos ( clj-json.core
y json
) no necesitan ser citados para evitar la evaluación.
- ¿Por qué la notación de lista no permite: como?
Lo siento, no sé la respuesta a esta.
Ah, eché un vistazo a los documentos para require
y lo descubrí. Hay otra forma soportada:
"Lo siguiente cargaría las bibliotecas clojure.zip y clojure.set abreviadas como ''s''."
(require ''(clojure zip [set :as s]))
Me cuesta entender (y, por tanto, recordar) que el clojure requiere la sintaxis que se describe aquí: http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require . Parece tanto contra intuitivo como no uniforme.
Por ejemplo, en el siguiente por qué es necesario citar este vector:
(require ''[clj-json.core :as json])
Contador intuitivo porque normalmente los vectores no se citan en clojure (las listas se citan y los vectores se tratan como datos).
Y no uniforme porque en este caso el vector NO se cita:
(ns xxx
(:require [clj-json.core :as json]))
Me doy cuenta de que la función require y la función require :require
dentro de la macro ns solo son ópticamente similares, pero aún así.
También hay otras piezas de rareza, por ejemplo, puedo hacer esto:
(require ''(clj-json.core))
Pero no puedo hacer esto:
(require ''(clj-json.core :as json))
Alguien puede responder estas preguntas:
- en el primer ejemplo, ¿por qué es necesario citar el vector?
- ¿Por qué no necesita ser citado en la macro ns?
- ¿Por qué la notación de lista no permite
:as
?
Me pregunto si hay razones por las que las cosas son como son o si la inconsistencia no se notó en el momento del diseño.