是否可以在scala 2.10中使用一次宏调用生成几个顶级类?

Rog*_*ach 8 macros scala scala-2.10

我有一个带有大量样板的程序(遗憾的是,即使是Scala机制也不能简化).但是如果有一种方法可以用宏生成复杂的顶级类,那么所有的样板都将消失.例如:

package org.smth

generate(params)

// becomes

class A { ... }
object B { ... }
case class C { ... }
Run Code Online (Sandbox Code Playgroud)

Scala 2.10宏可以实现吗?

Jör*_*tag 7

简而言之:没有.

计划使用宏类型(即生成类型而不是方法的宏),但它们不是设计也不是指定,更不用说实现了,它们不适用于2.10.

此外,单个宏调用只能生成单个类型.但是,由于类型(特别是objects)可以嵌套,因此这不是限制:您只需生成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._
Run Code Online (Sandbox Code Playgroud)

他们考虑过package可以生成完整类的整个包的宏,但是我们意识到,因为objects是s的超集,所以package类型宏可以生成object不必要的s.

  • 是的,这是可能的,但是本地类不需要在全局符号表中注册,所以它很简单. (2认同)