Mir ist soeben eine ganz wesentliche Einschränkung von
harms Lösung und damit auch meiner Abwandlung davon aufgefallen: Nicht jeder kann jeden zitieren, erstaunlich, dass uns das beiden noch nicht aufgefallen ist … Wenn die \addQuote-Befehle eine bestimmte Reihenfolge haben, in der A über B steht, dann kann B A zitieren, aber A B nicht (z. B. kann foo im verlinkten Beitrag nicht bla zitieren).
Allgemein gesprochen: Wir stellen uns einen gerichteten Graphen vor, in dem eine Kante A→B bedeutet, dass A B zitiert. An diesen gabs bisher so gut wie keine Anforderungen (Zyklen sind nur verboten, wenn die Zitate alle zum gleichen Zeitpunkt passieren; lustigerweise gerät LilyPond weder in eine Endlosschleife noch hauts ne Warnung raus falsch gedacht, LilyPonds quoteDuring ist ja nicht transitiv). Jetzt muss er aber ein DAG (gerichteter azyklischer Graph) sein; die nötige Anordnung der \addQuote-Befehle ergibt sich dann aus einer topologischen Sortierung dieses Graphen. Das ist schon eine ziemlich einschneidende Anforderung.Meine Erklärung mithilfe von LilyPonds Fehlermeldung: Angenommen, \addQuote "A" \A steht über \addQuote "B" \B und A zitiert B per \quoteDuring "B" s1.
\addQuote "A" \A wertet A nun per replaceQuote aus, stößt auf den \quoteDuring-Befehl, schaut also nach einem zitierbaren "B" und findet es nicht.
Ich habe gerade nur eine Idee, was man da machen könnte: lazy evaluation. Ich hab mal gelesen, dass Scheme das kann, bin mir aber noch nicht klar darüber, in welchem Ausmaß das geht und ob das hier weiterhelfen könnte oder LilyPond mir nen Strich durch die Rechnung macht. Ich probier das mal.
Edit: Mal abgesehen davon, dass promise?, force und delay da sind, aber GUILE lazy nicht kennt (
warum auch immer delay und force sind grundsätzlich Teil der Sprache, lazy kommt mit SRFI-45 dazu, wenn ich
das hier und
das hier richtig verstehe), hab ich irgendwie gerade gar keinen Plan …