Verwenden von LabelDef in Scala-Makros (2.10)

Ich experimentiere mit den Makrofunktionen von Scala 2.10. Ich habe Probleme bei der VerwendungLabelDef in einigen Fällen jedoch. Bis zu einem gewissen Grad habe ich im Code des Compilers nachgesehen und Auszüge daraus gelesenDie Papiere von Miguel Garcia aber ich stecke immer noch fest.

Wenn mein Verständnis stimmtwäre eine Pseudodefinition:
LabelDef(labelName, listOfParameters, stmsAndApply) wo die 3 Argumente sind Bäume und:
- labelNameist die Kennung des Etiketts$ L definiert werden
- listOfParameters entsprechen den Argumenten, die bei dersich bewerben vorkommt, wie in$ L (a1, ..., an)und kann leer sein
- stmsAndApplyentspricht dem Block vonAussagen (möglicherweise keine) und endgültigsich bewerben-Ausdruck
Label-Apply bedeutet mehr oder weniger ein GOTO auf ein Label

Zum Beispiel kann im Fall einer einfachen Schleife eine LabelDef schließlichsich bewerben selbst:
LabelDef($L, (), {...; $L()})

Nun, wenn ich 2 LabelDef definieren möchte, die miteinander springen:

...
LabelDef($L1, (), $L2())
...
LabelDef($L2, (), $L1())
...

Das 2. LabelDef ist in Ordnung, aber der Compiler gibt einen Fehler beim 1. "nicht gefunden: Wert" aus$ L2". Ich denke, das liegt daran$ L2 ist noch nicht definiert, während versucht wird, es anzuwenden. Dies ist ein Baum, der so gebaut wird, dass er für mich Sinn ergibt. Ist mein Verständnis soweit korrekt? Wenn kein Fehler erwartet wird, bedeutet das, dass meine Makroimplementierung wahrscheinlich fehlerhaft ist.

Sowieso glaube ich dortMuss eine Möglichkeit sein, $ L2 von $ L1 anzuwenden (d. h. zu $ ​​L2 zu springen),irgendwie, aber ich habe keine Ahnung, wie es geht. Hat jemand ein Beispiel dafür oder einen Zeiger?


Andere unklare Punkte (die derzeit jedoch weniger wichtig sind) bei der Verwendung von LabelDef in Makros sind:
-Was ist das zweite Argument konkret, wie wird es verwendet, wenn es nicht leer ist? Mit anderen Worten, was sind die Mechanismen eines Label-Apply mit Parametern?
-ist es gültig, im letzten Ausdruck des dritten Arguments etwas anderes als ein Label-apply einzufügen? (nicht, dass ich es nicht versuchen kann, aber Makros sind noch experimentell)
- Ist es möglich, ein Weiterleitungsetikett außerhalb eines LabelDef anzuwenden? (Vielleicht ist das eine überflüssige Frage)

Jedes Makro-Implementierungsbeispiel in der Antwort ist natürlich sehr willkommen!
Prost,

Antworten auf die Frage(1)

Ihre Antwort auf die Frage