Scala宏:上下文DSL(限制宏对作用域的使用)

时间:2014-11-11 18:51:39

标签: scala macros dsl scala-macros

我正在尝试使用Scala宏构建DSL。

假设我有两个宏

def add(x: Int, y: Int): Unit = macro Macros.mImpl
def builder(body: => Unit): Unit = macro Macros.builderImpl

其中Macros是定义宏行为的对象。

这些宏的用途是编写如下内容:

def example: Unit =
  builder {
    println("Hello, world!")
    // Some statements...
    add(4, 5)
    // Some more statements...
  }

这里的关键是在DSL内,add应该只允许在builder块内发生。

例如,以下内容应

def bad: Unit = add(4, 5)

我想找到一些方法来确保编译器禁止出现add这样的事件。

任何解决方案都可以:通过类型系统(但我真的不知道如何),或通过宏机制本身。

由于宏从最里面的上下文向外扩展(即自下而上,而不是自上而下),我不知道如何在add的宏定义中实现这一点。

(如果它有帮助,可以随意修改宏的返回类型或定义站点;它们是为了一个简单的例子而选择的。)

0 个答案:

没有答案