【问题标题】:Will it be possible to generate several top-level classes with one macro invocation in scala 2.10?在 scala 2.10 中是否可以通过一次宏调用生成多个顶级类?
【发布时间】:2012-09-06 08:28:35
【问题描述】:

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

package org.smth

generate(params)

// becomes

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

Scala 2.10 宏可以实现吗?

【问题讨论】:

    标签: scala macros scala-2.10


    【解决方案1】:

    简而言之:没有。

    Macro types(即生成类型而不是方法的宏)已计划好,但尚未设计或指定,更不用说实现了,而且不会用于 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._
    

    他们考虑过package 宏可以生成完整的类包,但意识到由于objects 是packages 的超集,并且类型宏可以生成objects,这是不必要的.

    【讨论】:

    • 但是现在可以在方法宏中生成内部类吗?喜欢val a = { class A { ... }; new A smth }
    • 可以,但是局部类不需要注册到全局符号表中,所以很简单。
    • Generate(params)的返回类型是什么?
    猜你喜欢
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2014-09-21
    • 2020-09-07
    • 1970-01-01
    • 2021-08-29
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多