So, hab ne Lösung:
Statt nen String zusammen zu basteln und den an den LilyPond-Parser zu füttern, damit LilyPond am \ eine Variable erkennt und den Inhalt der Variable dieses Namens holt, gehts mit ein bisschen weniger Umweg direkt in Scheme: Der String wird zu nem Symbol gemacht und Scheme holt den Inhalt der Variable dieses Namens.
\version "2.19.37"
MUSIC = \relative { g a b c d1 }
TEXT = "Bitteschön!"
pointermusic = "MUSIC"
pointertext = "TEXT"
soso = #(define-scheme-function () ()
#{
\score {
\header {
piece = #(module-ref (current-module) (string->symbol pointertext))
}
\new Staff { #(ly:parser-include-string (string-append "\\" pointermusic )) }
}
#})
\soso
Das funktioniert auch an anderen Stellen (sodaß hier ly:parser-include-string und string-append gar nicht mehr nötig sind), außerdem kann man sich string->symbol sparen, wenn man gleich Symbole definiert:
\version "2.19.37"
MUSIC = \relative { g a b c d1 }
TEXT = "Bitteschön!"
pointermusic = #'MUSIC
pointertext = #'TEXT
soso = #(define-scheme-function () ()
#{
\score {
\header {
piece = #(module-ref (current-module) pointertext)
}
\new Staff {
#(module-ref (current-module) pointermusic)
}
}
#})
\soso
Edit: Das Stichwort, wonach ich gesucht hab, lautet „Reflection“ (gibts auch in anderen Programmiersprachen wie z. B. Java). Gefunden hab ich dann
diesen Abschnitt der Guile-Dokumentation, wo module-ref und current-module (sowie weitere Funktionen) dokumentiert sind.
2. Edit: Ich habs tatsächlich nicht da gefunden, sondern im
entsprechenden Abschnitt der Guile-2.0-Dokumentation. Warum das in 1.8 auch funktioniert, aber anscheinend nicht dokumentiert ist (ich hatte den Link oben angegeben, ohne nochmal den genauen Inhalt der Seite zu prüfen), ist mir nicht klar …