2016-10-08 6 views
0

Там, кажется, несоответствие между возвращаемым значением type.getAttributes() и значение аргумента type.getAttribute() о (qulified против неквалифицированного) именования атрибутов:Тип-безопасное метапрограммирование? Использование строк для запроса ceylon.language для метаинформации?

Если имя из атрибут, возвращаемый getAttributes, например, «Ceylon.language :: String.reversed» это не может быть использована, чтобы пронестись над атрибутами двух моделей:

value stringType1 = `String`; 
value stringType2 = `String`; 
for (a in stringType1.getAttributes<String,Anything,Nothing>(`SharedAnnotation`)) { 
    if(exists p = stringType2.getAttribute<String,Anything,Nothing>(a.string)) { 
     print(" > `` p ``  ");} 
} 

Этот код не дает ожидаемого результата, потому что GetAttribute() ожидает, например, «reverse» как строка аргумента вместо «ceylon.language :: String.reversed», который возвращается getAttributes().

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

Единственное альтернативное решение, которое я вижу, это прочитать все атрибуты в, например, TreeSet, напишите Comparator, который сравнивает представление моделей с атрибутами вместо их строкового представления, и поэтому давайте возьмем необходимые атрибуты в правильном порядке для их zip. Или что-то вроде: zip (... getAttributes < ...> (...). Sort(), ... getAttributes < ...> (...). Sort())?

Иногда это может быть неэффективным, потому что для обработки требуется все атрибуты, когда иногда требуются не все атрибуты.

Было бы желательно иметь стандартный апи подвергать метаинформацию аналогично с API коллекций для задачи, такие как рекурсивно применить функцию сравнения объекта иерархии, чтобы соответствовать или тест для различных типов равенства (по точное соответствие типа, по подтипу, по значению, унифицируемости, ...)

Может потребоваться коллекция метаинформации на основе дерева, функция выбора для извлечения только необходимой информации и функции сравнения. В конце концов, это будет своего рода LINQ для метаинформации ceylon.

Мне интересно, если такой api уже существует или он запланирован, или пользователю остается сделать собственную собственную реализацию?

То, что я действительно не понимаю, это то, что строки используются для запроса ceylon.language для метаинформации, где безопасность типов была явной целью проектирования для метапрограммирования цейлона.

ответ

1

Чтобы получить неквалифицированное название атрибута a, вы должны использовать a.declaration.name. (Или a.declaration.qualifiedName получить квалифицированное имя.)

Не используйте a.string, поскольку, как документально Object.string, это просто

Разработчик дружественных строка, представляющая экземпляр.

Он не предназначен для использования в качестве ключа.