Подтвердить что ты не робот

Каковы некоторые применения метаданных Clojure?

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

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

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

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

4b9b3361

Ответ 1

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

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

    (test #'something)

Если вы читаете Программирование 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] ....

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