Что делает "^: static" в Clojure?
Я видел метаданные ^:static
на довольно многих функциях в исходном коде Clojure core.clj
, например. в определении seq?
:
(def
^{:arglists '([x])
:doc "Return true if x implements ISeq"
:added "1.0"
:static true}
seq? (fn ^:static seq? [x] (instance? clojure.lang.ISeq x)))
Что именно делают эти метаданные и почему оно так часто используется в течение core.clj
?
Ответы
Ответ 1
В разработке Clojure 1.3 Rich хотел добавить возможность для функций возвращать типы, отличные от Object. Это позволит использовать собственные математические операторы без необходимости перебирать все в одну функцию.
Для первоначальной реализации требуются функции, которые поддерживали это для маркировки :static
. эти метаданные заставляют компилятор создавать две версии функции, одну из которых возвратил объект Object, и тот, который возвращал этот конкретный тип. в случаях, когда компилятор определил, что типы всегда будут соответствовать более конкретной версии.
Это было позже сделано полностью автоматическим, поэтому вам больше не нужно добавлять это.
Ответ 2
В соответствии с потоком групп Google "Тип подсказки несоответствий в 1.3.0" , его нет-op.
^:static
был ненастроенным в течение некоторого времени AFAIK, сделанный ненужным после изменений в vars некоторое время назад.
- сообщение за май 2011 года Chas Emerick
Ответ 3
Кажется, это новый атрибут метаданных в clojure 1.3. И вы можете сравнить источник между 1.3 и 1.2:
Итак, я думаю, что это имеет какое-то отношение к ^: dynamic, который указывает, разрешено ли var для динамической привязки. Просто думаю. Не уверен, пока не увижу документ об этом атрибуте.