我可以从模板生成Scala代码吗?
我知道如何在Racket/Scheme/Lisp中做到这一点,但在Scala中却不知道。这是Scala宏可以做到的吗?
我想要一个X
变化的代码模板。如果我有这个代码模板:
def funcX(a: ArgsX): Try[Seq[RowX]] =
w.getThing() match {
case Some(t: Thing) => w.wrap(t){Detail.funcX(t, a)}
case _ => Failure(new MissingThingException)
}
和标记Apple
和Orange
,宏将采用my模板,替换X
,并生成:
def funcApple(a: ArgsApple): Try[Seq[RowApple]] =
w.getThing() match {
case Some(t: Thing) => w.wrap(t){Detail.funcApple(t, a)}
case _ => Failure(new MissingThingException)
}
def funcOrange(a: ArgsOrange): Try[Seq[RowOrange]] =
w.getThing() match {
case Some(t: Thing) => w.wrap(t){Detail.funcOrange(t, a)}
case _ => Failure(new MissingThingException)
}
3条答案
按热度按时间toe950271#
使用树转换器尝试macro annotation
第一个
你也可以尝试用类型类的方法
lf3rwulv2#
在我看来,您可以将
funcX
函数作为高阶函数传递,也可以将它与currying结合起来,创建一个 “函数工厂”:然后,您可以使用它来创建
funcApple
或funcOrange
的示例:我假设
Detail.funcApple
和Detail.funcOrange
的签名与(Thing, X) => RowX
相似,但当然您可以使用不同的签名。ax6ht2ek3#
您可能实际上不需要宏来实现这一点,您可以使用一个模式匹配一个泛型类型,如下所示: