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

Что делает "^: 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?

4b9b3361

Ответ 1

В разработке Clojure 1.3 Rich хотел добавить возможность для функций возвращать типы, отличные от Object. Это позволит использовать собственные математические операторы без необходимости перебирать все в одну функцию.

Для первоначальной реализации требуются функции, которые поддерживали это для маркировки :static. эти метаданные заставляют компилятор создавать две версии функции, одну из которых возвратил объект Object, и тот, который возвращал этот конкретный тип. в случаях, когда компилятор определил, что типы всегда будут соответствовать более конкретной версии.

Это было позже сделано полностью автоматическим, поэтому вам больше не нужно добавлять это.

Ответ 3

Кажется, это новый атрибут метаданных в clojure 1.3. И вы можете сравнить источник между 1.3 и 1.2:

Итак, я думаю, что это имеет какое-то отношение к ^: dynamic, который указывает, разрешено ли var для динамической привязки. Просто думаю. Не уверен, пока не увижу документ об этом атрибуте.