2009-07-24 13 views
29

¿Cómo ha utilizado los metadatos en su programa Clojure?¿Cuáles son algunos usos de los metadatos de Clojure?

vi un ejemplo de programación Clojure:

(defn shout [#^{:tag String} message] (.toUpperCase message)) 
;; Clojure casts message to String and then calls the method. 

Algunos de los usos? Esta forma de programación es completamente nueva para mí.

Respuesta

1

metadata es utilizado ampliamente por el compilador para cosas como el almacenamiento del tipo de un objeto.
se utiliza este tipo cuando se da insinúa

(defn foo [ #^String stringy] .... 

lo he usado para cosas como el almacenamiento de la cantidad de relleno que se añadió a un número. Está destinado a la información que es 'ortogonal' a los datos y no debe considerarse al decidir si sus valores son los mismos.

24
  • Las cadenas de documentos se almacenan como metadatos con la tecla: doc. Este es probablemente el uso más aparente de los metadatos.
  • Los tipos de devolución y de parámetro se pueden etiquetar opcionalmente con metadatos para mejorar el rendimiento al evitar la sobrecarga de la reflexión sobre los tipos en tiempo de ejecución. Estos también se conocen como "sugerencias de tipo". #^String es una pista de tipo.
  • Almacenar cosas "debajo del capó" para su uso por el compilador, como el argot de una función, el número de línea donde se ha definido una var o si una var contiene una referencia a una macro. Por lo general, el compilador los agrega automáticamente y normalmente no es necesario que el usuario los manipule directamente.
  • Creación de casos de prueba simples como parte de una definición de función:

    (defn #^{:test (fn [] (assert true))} something [] nil)

    (test #'something)

Si está leyendo Programación Clojure, a continuación, el capítulo 2 proporciona una buena introducción a los metadatos. La Figura 2.3 proporciona un buen resumen de los metadatos comunes.

14

Por la diversidad alguna respuesta, que no se centra en la interacción con el lenguaje mismo:

También puede por ejemplo. rastrea la fuente de algunos datos. La entrada no verificada está marcada como :tainted. Un validador puede verificar cosas y luego establecer el estado en :clean. El código que hace las cosas relevantes para la seguridad puede aparecer en :tainted y solo aceptar la entrada ed :clean.

5

Meta Data me fue extremadamente útil para escribir. Estoy hablando no solo de sugerencias de tipo, sino de un sistema de tipo personalizado completo. Más simple ejemplo - Sobrecarga del método de impresión para estructuras (o cualquier otra var):

(defstruct my-struct :foo :bar :baz) 

(defn make-my-struct [foo bar baz] 
    (with-meta (struct-map my-struct :foo foo :bar baz :baz baz) 
     {:type ::my-struct})) 


(defmethod print-method 
    [my-struct writer] 
    (print-method ...)) 

En general, junto con capacidades de validación de Clojure que pueden aumentar la seguridad y, al mismo tiempo, la flexibilidad de su código muchísimo (aunque tomará un poco más de tiempo para hacer la codificación real).

Para obtener más ideas sobre cómo escribir, consulte types-api.

Cuestiones relacionadas