Что делает «^: static» в Clojure? - PullRequest
       30

Что делает «^: static» в Clojure?

33 голосов
/ 26 сентября 2011

Я видел метаданные ^: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?

Ответы [ 3 ]

38 голосов
/ 26 сентября 2011

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

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

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

9 голосов
/ 26 сентября 2011

В соответствии с веткой групп Google «Введите несоответствия подсказок в 1.3.0» , это не работает .

^:static некоторое время не использовался AFAIK, после ненужных изменений в vars назад он стал ненужным.

- пост за май 2011 года от Chas Emerick

0 голосов
/ 26 сентября 2011

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

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

...