^
es "el carácter meta" que dice the reader añadir el símbolo a partir de ^
como metadatos para el siguiente símbolo (siempre y cuando es algo que implementa IMetas)
user=> (def x ^:IamMeta [1 2 3])
#'user/x
user=> x
[1 2 3]
user=> (meta x)
{:tag :IamMeta}
user=>
Usted puede aprender mucho acerca de cómo funciona la clojure bajo el capó mirando el meta
de las cosas, para las funciones de ejemplar: 012
user=> (meta foo)
{:ns #<Namespace user>,
:name foo, :file "NO_SOURCE_PATH",
:line 5, :arglists ([s])}
esto es muy a menudo utilizado para type hints
(defn foo [^String s] (.charAt s 1))
lo general es una buena idea para encender las advertencias reflexión (set! *warn-on-reflection* true)
y luego añadir más consejos de tipo hasta que las advertencias desaparecen. sin estos, Clojure buscará el tipo de operandos de función en tiempo de ejecución, lo que le ahorrará la molestia de preocuparse por los tipos, aunque a un bajo costo.
PS: Mi siguiente carácter lector favorito es el carácter "expedición" #
, es bien vale la pena aprender sobre él :) próximos
PPS: esto es diferente en clojure 1.2.x 1.3.x vs clojure en clojure 1.2.1 metadatos no compone cuando se utiliza el meta-caracteres:
user=> (def foo ^:foo ^:bar [1 2 3])
#'user/foo
user=> (meta foo)
{:tag :foo}
y 1.3 que "hace lo correcto", y también palabras clave son las opciones en lugar de "tags":
user=> (def foo ^:foo ^:bar [1 2 3])
#'user/foo
user=> (meta foo)
{:foo true, :bar true}
No es exactamente "agregar el símbolo". Un símbolo es un atajo para un tipo int. Pero esto también funciona con cadenas, ej. '^" B ["'. Las palabras clave se traducen a opciones, ej. '^: foo' se convierte en' {: foo true} '. Y finalmente puedes especificar un mapa en sí, ej. '^ {: tag String: foo true: bar: baz}'. – kotarak
buen punto kotarak, también deberíamos mencionar que los metadatos se componen de manera diferente en las diferentes versiones de clojure y creo que 1.3 comienza a copiar los metadatos encadenados '^: foo ^: bar [1 3 4]' –