我正在尝试 scala 2.10 宏功能。我使用时遇到问题LabelDef但在某些情况下。在某种程度上,我偷看了编译器的代码,阅读了摘录米格尔·加西亚的论文 http://lampwww.epfl.ch/~magarcia但我还是卡住了。
如果我的理解是正确的,伪定义是:
LabelDef(labelName, listOfParameters, stmsAndApply)
其中 3 个参数是 Trees 并且:
- labelName
是标签的标识符$L被定义
- listOfParameters
对应于 label- 时传递的参数apply发生,如$L(a1,...,an),并且可以为空
- stmsAndApply
对应的块声明(可能没有)和最终的apply-表达
label-apply 或多或少意味着 GOTO 到标签
例如,在简单循环的情况下,LabelDef 最终可以apply itself:
LabelDef($L, (), {...; $L()})
现在,如果我想定义 2 个互相跳转的 LabelDef:
...
LabelDef($L1, (), $L2())
...
LabelDef($L2, (), $L1())
...
第2个LabelDef没问题,但第1个编译器输出错误,“未找到:值$L2”。我想那是因为$L2在尝试应用它时尚未定义。这是一棵正在建造的树,因此对我来说是有意义的。到目前为止我的理解正确吗?因为如果预计不会出现错误,则意味着我的宏实现可能有错误。
无论如何,我相信有must是从 $L1 应用 $L2 (即跳转到 $L2)的一种方式,somehow,但我只是不知道该怎么做。有人有这样做的例子,或者有任何指示吗?
关于在宏中使用 LabelDef 的其他不清楚的地方(但现在不太关心)是:
-第二个参数是什么,具体来说,非空时如何使用?换句话说,带参数的标签应用机制是什么?
- 在第三个参数的最终表达式中放入除标签应用之外的任何内容是否有效? (并不是说我不能尝试,但宏仍然处于实验阶段)
- 是否可以在 LabelDef 之外执行转发标签应用? (也许这是一个多余的问题)
当然,非常欢迎答案中的任何宏实现示例!
Cheers,