类型安全的元编程?使用字符串查询 ceylon.language 元信息?

Type-safe metaprogramming? Using strings to query ceylon.language for meta information?

return type.getAttributes() 的值与 type.getAttribute() 的参数值之间似乎不匹配属性:

如果由 getAttributes return编辑的属性名称是例如"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() 需要例如"reversed" 作为参数字符串,而不是 "ceylon.language::String.reversed",后者由 getAttributes() return 编辑。

一般来说,我不赞成使用字符串来完成这样的任务。但这似乎是通过使用字符串查询来 直接 检索单个属性的唯一方法。

我看到的唯一替代解决方案是将所有属性读入例如一个 TreeSet,编写一个比较器来比较属性的模型表示而不是它们的字符串表示,因此让我们以正确的顺序检索所需的属性以压缩它们。 或者类似的东西:zip(...getAttributes<...>(...).sort(), ...getAttributes<...>(...).sort())?

有时这可能效率不高,因为它需要处理 所有 属性,而有时并不需要所有属性。

最好有一个 标准 api 以类似于集合的方式公开元信息 api 用于递归应用的任务对象层次结构的比较函数,用于匹配或测试不同类型的相等性(通过精确类型匹配、子类型、值、统一性……)

它可能需要基于树的元信息集合、仅检索所需信息的选择功能和比较功能。最后,它将是锡兰元信息的 LINQ。

我想知道这样的 api 是否已经存在或计划中,还是留给用户自己定制实现?

我真正不明白的是,字符串用于查询 ceylon.language 元信息,其中类型安全是锡兰元编程的明确设计目标。

您应该使用 a.declaration.name 来获取属性 a 的非限定名称。 (或 a.declaration.qualifiedName 以获得限定名称。)

不要使用 a.string,因为,正如 Object.string 所记录的那样,它只是

A developer-friendly string representing the instance.

它不能用作密钥。