我正在努力将宏添加到我的 DSL 中。我想知道是否可以在 DSL 层访问我的 DSL 的 Rascal AST,以便我可以直接引用 AST。例如:
defmacro example(oldEntity : Entity):
if oldEntity.simpleName == "Account":
entity #{concat(oldEntity.simpleName, "_New")}{
...
}
else:
entity #{oldEntity.simpleName}{
...
}
这里,
simpleName
是实体 AST 的一个组件。
注意:上面的语法仅用于说明。
是的,这是可能的。实现很简单,但设计可能很困难。
您拥有的有关源程序的每条信息都会暴露给程序员。如果您正在编写一个解释器,这只是产生该信息的 Rascal 函数的结果。如果您正在编写编译器,则需要设计在运行时访问该信息。会有一个编译时 Rascal 函数在代码中生成常量以及对这些常量进行操作的方法。
我猜你正在写一个类似 lisp 的解释器。这是为您的语言设计“反射 API”的问题。您将在哪些范围内向程序员提供哪些函数和参考?您的解释器可能必须对以前仅是静态名称的表达式调用
eval
(因此 lookup
变为 eval
)