scala 2.10 マクロ機能を試しています。ただし、場合によっては、LabelDefの使用に問題があります。コンパイラのコードをある程度のぞき見したり、Miguel Garcia の論文の抜粋を読んだりしましたが、まだ行き詰まっています。
私の理解が正しければ、疑似定義は次のようになります:
LabelDef(labelName, listOfParameters, stmsAndApply)
3 つの引数は Trees であり、
-は定義されているラベル$LlabelName
の識別子です- $L(a1のように、label
- applyが発生したときに渡される引数に対応します,...,an)、および空にすることができます
-ステートメントのブロック(おそらくなし) に対応し、最後のapply -expression
label-apply は多かれ少なかれラベルへの GOTO を意味しますlistOfParameters
stmsAndApply
たとえば、単純なループの場合、LabelDef は最終的にそれ自体を適用できます。
LabelDef($L, (), {...; $L()})
ここで、互いにジャンプする 2 つの LabelDef を定義する場合:
...
LabelDef($L1, (), $L2())
...
LabelDef($L2, (), $L1())
...
2 番目の LabelDef は問題ありませんが、コンパイラは 1 番目に "not found: value $L2 " というエラーを出力します。これは、適用しようとしているときに$L2がまだ定義されていないためだと思います。これは構築中のツリーなので、私には意味があります。これまでの私の理解は正しいですか?エラーが予想されない場合、それは私のマクロ実装におそらくバグがあることを意味するためです。
とにかく、何らかの方法で$L1 から $L2 を適用する (つまり、$L2 にジャンプする) 方法が必要だと思いますが、その方法がわかりません。誰かがそれを行う例、またはポインタを持っていますか?
マクロでの LabelDef の使用に関するその他の不明確な点 (ただし、現在はそれほど懸念されていません) は次
のとおりです。つまり、パラメーターを使用したラベル適用のメカニズムは何ですか?
- 3 番目の引数の最終式に label-apply 以外のものを入れることは有効ですか? (試すことができないわけではありませんが、マクロはまだ実験
段階です) -LabelDef の外で転送ラベル適用を実行することは可能ですか? (これは冗長な質問かもしれません)
もちろん、答えの中のマクロの実装例は大歓迎です!
乾杯、