我正在尝试使用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
的宏定义中实现这一点。
(如果它有帮助,可以随意修改宏的返回类型或定义站点;它们是为了一个简单的例子而选择的。)