Каковы некоторые применения метаданных Clojure?
Как вы использовали метаданные в своей программе Clojure?
Я видел один пример из программирования Clojure:
(defn shout [#^{:tag String} message] (.toUpperCase message))
;; Clojure casts message to String and then calls the method.
Каковы некоторые виды использования? Эта форма программирования для меня совершенно новая.
Ответы
Ответ 1
Если вы читаете Программирование Clojure, то глава 2 обеспечивает хорошее введение в метаданные. Рисунок 2.3 дает хорошее резюме общих метаданных.
Ответ 2
Для разнообразия некоторый ответ, который не концентрируется на взаимодействии с самим языком:
Вы также можете, например. отслеживать источник некоторых данных. Непроверенный ввод отмечен как :tainted
. Валидатор может проверить вещи, а затем установить статус :clean
. Код, выполняющий важные для безопасности вещи, может затем зависеть от :tainted
и принимать только :clean
ed вход.
Ответ 3
Метаданные были очень полезны для меня в целях набора текста. Я говорю не только о типах подсказок, но и о полной системе пользовательского типа. Простейший пример - перегрузка print-метода для structs (или любого другого 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 ...))
В целом, наряду с возможностями проверки w120 > он может повысить безопасность и, в то же время, гибкость вашего кода очень сильно (хотя для фактического кодирования потребуется еще немного времени).
Дополнительные идеи по набору текста см. types-api.
Ответ 4
метаданные широко используются компилятором для таких вещей, как сохранение типа объекта.
вы используете это, когда вы даете подсказки типов
(defn foo [ #^String stringy] ....
Я использовал его для таких вещей, как сохранение количества дополнений, добавленных к числу. Он предназначен для информации, которая является "ортогональной" к данным и не должна учитываться при принятии решения о том, являются ли значения одинаковыми.