我正在使用ScalamacrosreplaceJava程序中的一些代码生成组件,并正在运行到Java虚拟机对于单个方法(64千字节)生成的字节代码大小的限制。 例如,假设我们有一个大型的XML文件,它代表了我们想要在程序中使用的从整数到整数的映射。 我们希望避免在运行时parsing这个文件,所以我们将编写一个macros来编译时进行parsing,并使用文件的内容来创build我们方法的主体: import scala.language.experimental.macros import scala.reflect.macros.Context object BigMethod { // For this simplified example we'll just make some data up. val mapping = List.tabulate(7000)(i => (i, i + 1)) def lookup(i: Int): Int = macro lookup_impl def lookup_impl(c: Context)(i: c.Expr[Int]): c.Expr[Int] = { import c.universe._ val switch = reify(new scala.annotation.switch).tree val cases = mapping […]
所以我有这个macros: import language.experimental.macros import scala.reflect.macros.Context class Foo class Bar extends Foo { def launchMissiles = "launching" } object FooExample { def foo: Foo = macro foo_impl def foo_impl(c: Context): c.Expr[Foo] = c.Expr[Foo](c.universe.reify(new Bar).tree) } 我已经说过三次了,我想让foo返回一个Foo ,但是我可以做以下事情(在2.10.0-RC3中): scala> FooExample.foo res0: Bar = Bar@4118f8dd scala> res0.launchMissiles res1: String = launching 同样的事情发生,如果我删除c.Expr上的types参数。 如果我真的想要确保谁打电话给foo看不到他们得到一个Bar ,我必须在树本身添加一个types归属。 这实际上非常棒,例如,我可以将某个macros指向某种types的模式,并使用表示词汇表中的词的成员方法创build一些Vocabulary类的匿名子类,这些方法将在返回的对象上提供。 不过,我想明白我在做什么,所以我有几个问题。 首先, foo方法实际返回的types是什么? […]
我试图从Scala内部的quasiquote调用一个Shapelessmacros,我没有得到我想要的。 我的macros不会返回任何错误,但不会将Witness(fieldName)扩展为Witness.Lt[String] val implicits = schema.fields.map { field => val fieldName:String = field.name val fieldType = TypeName(field.valueType.fullName) val in = TermName("implicitField"+fieldName) val tn = TermName(fieldName) val cc = TermName("cc") q"""implicit val $in = Field.apply[$className,$fieldType](Witness($fieldName), ($cc: $className) => $cc.$tn)""" } 这是我的Field定义: sealed abstract class Field[CC, FieldName] { val fieldName: String type fieldType // How to extract […]