Запись Clojure: как получить подсказку типа по имени атрибута - PullRequest
9 голосов
/ 21 февраля 2011

Мне интересно, есть ли способ получить подсказку типа, связанную с атрибутами, объявленными с помощью defrecord. например, если у меня есть следующее определение записи:

(defrecord Foo [^Integer id ^String description])

Я бы хотел получить карту типа Foo, которая дает мне атрибуты и их подсказки. Я знаю, что могу получить список объявленных атрибутов с помощью отражения:

(->> record .getDeclaredFields (remove #(java.lang.reflect.Modifier/isStatic (.getModifiers #))))

Это дает мне список объявленных полей, но их типы Object. Я знаю, что Clojure - это динамический язык, но было бы неплохо, если бы типы возвращались мне, когда они мне нужны.

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

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

(defrecord-hinted Foo [^Integer id ^String description])

; you could then acces the type information with
(->> (meta (make-Foo 42 "forty two")) 
     ::field-types
     :id) ; => java.lang.Integer.class
1 голос
/ 24 февраля 2011

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

...