2009-07-24 2 views
29

Как вы использовали метаданные в своей программе Clojure?Что такое использование метаданных Clojure?

Я видел один пример из программирования Clojure:

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

Какие виды использования? Эта форма программирования для меня совершенно новая.

ответ

1

метаданные широко используются компилятором для таких вещей, как хранение типа объекта.
вы используете это когда вы даете тип подсказки

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

Я использовал его для таких вещей, как хранить количество дополнения, которое было добавлено в число. Он предназначен для информации, которая является «ортогональной» к данным и не должна учитываться при принятии решения о том, совпадают ли вы значения.

24
  • Docstrings хранятся в виде метаданных под ключом: doc. Это, вероятно, наиболее очевидное использование метаданных номер 1.
  • Возврат и типы параметров могут быть необязательно помечены метаданными для повышения производительности, избегая накладных расходов на отображение типов во время выполнения. Они также известны как «подсказки типа». #^String - это тип подсказки.
  • Хранение вещей «под капотом» для использования компилятором, например, список аргументов функции, номер строки, где был определен параметр var, или var содержит ссылку на макрос. Обычно они автоматически добавляются компилятором и обычно не требуют непосредственного манипулирования пользователем.
  • Создание простых testcases как часть определения функции:

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

    (test #'something)

Если вы читаете программирования Clojure, то Глава 2 обеспечивает хорошее введение в метаданные. Рисунок 2.3 дает хорошее резюме общих метаданных.

14

Для разнообразия какой-то ответ, который не концентрируется на взаимодействии с языком:

Вы можете также, например. отслеживать источник некоторых данных. Непроверенный ввод отмечен как :tainted. Валидатор может проверить вещи, а затем установить статус на :clean. Код, делающий важные для безопасности вещи, может затем занять :tainted и принимает только :clean ed input.

5

Meta Data был чрезвычайно полезен для меня в целях ввода. Я говорю не только о типах подсказок, но и о полной системе пользовательского типа. Простейший пример - перегрузка распечатки методы структур (или любой другой вар):

(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 ...)) 

В общем, вместе с возможностями проверки Clojure может повысить безопасность и, в то же время, гибкость коды очень очень (хотя для фактического кодирования потребуется некоторое время).

Дополнительные идеи по набору текста см. В types-api.