在Scala 2.10中,是否可以通过一次宏调用生成多个顶级类?

8

我有一个程序,有很多样板代码(不幸的是,即使使用Scala机制也无法减少)。但是如果有一种方法可以通过宏生成复杂的顶级类,所有的样板代码都将消失。例如:

package org.smth

generate(params)

// becomes

class A { ... }
object B { ... }
case class C { ... }

能否使用Scala 2.10宏实现这一点?
1个回答

7
简而言之:不能。
计划有宏类型(即生成类型而非方法的宏),但它们尚未设计、规定,更别提实现了,且它们不会在2.10中付诸实践。
此外,单个宏调用只能生成单个类型。但是,由于类型(特别是object)可以嵌套,这并不是限制:您可以仅生成包含所需所有类的单个顶级object。这与您的代码之间的区别基本上是一个额外的import语句。
package org.smth

type O = Generate(params)

// becomes

object O {
  class A { ... }
  object B { ... }
  case class C { ... }
}

// which means you need an additional

import O._

他们思考过能够生成整个类包的package宏,但是他们意识到由于objectpackage的超集,并且类型宏可以生成object,所以这并不是必要的。

1
现在是否可以在方法宏中生成内部类?例如 val a = { class A { ... }; new A smth } - Rogach
2
是的,这是可能的,但是本地类不需要在全局符号表中注册,所以很简单。 - Eugene Burmako
Generate(params) 的返回类型是什么? - user833970

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接