【发布时间】:2014-01-03 16:17:57
【问题描述】:
我正在开发一个宏,在它的实现中我得到了 weakTypeOf T 其中 T 是宏函数的类型参数。我想拼接信息,从这个具体类型的方法定义到一个新的类声明树。我无法获得类型参数的 AST(为了对其进行模式匹配),所以我必须绝对使用基于符号的 API。我的问题是如何在比缩进和成员选择更多的位置拼接符号?
例如要获取我所做的符号列表:
val methodDefs = tpe.declarations
.filter(decl => decl.isMethod && decl.isPublic && !decl.asMethod.isConstructor && !decl.isSynthetic)
.map(symb => symb.asMethod)
然后将信息拼接到 q 插值器,我想这样做:
val newdefs : List[Tree] = methodDefs.map(methodDef => { q"def ${methodDef.name}[..${methodDef.typeParams}](...${methodDef.paramss}): ${methodDef.returnType} = ???"})
根据符号如何拼接(described here (PDF)),我不能直接做这种拼接。实现这一目标的正确方法是什么?
【问题讨论】:
-
我唯一能想到的就是手动创建对应类型和值参数的树。名称和类型可以拼接得很好,但是还不错。
-
通过使用 Liftable,对吗?谢谢你:D(一点也不差,相反我觉得这个功能很有表现力!)
-
好的,我想我明白了。无需升降。
-
好吧,我确实认为在这个用例中事情会变得冗长,所以也许会更好,但我没有立即看到如何改进。
-
这比我想象的要复杂得多:gist.github.com/xeno-by/8252596
标签: scala scala-macros scala-quasiquotes