LilyPond erweitern: 1.2.3 Eingabe-Variablen und Scheme

### 1.2.3 Eingabe-Variablen und Scheme

Das Eingabeformat unterstützt die Notation von Variablen: Im folgenden Beispiel wird ein musikalischer Ausdruck einer Variablen mit der Bezeichnung `traLaLa` zugewiesen:

>     traLaLa = { c'4 d'4 }

Variablen haben beschränkte Geltungsbereiche: im unten stehenden Beispiel enthält auch die `\layout`-Umgebung eine `traLaLa`-Variable, die sich aber von der `traLaLa`-Variable auf oberster Ebene unterscheidet:

>     traLaLa = { c'4 d'4 }
>     \layout { traLaLa = 1.0 }

Jede Eingabedatei ist solch ein Gültigkeitsbereich, und alle `\header`-, `\midi`- und `\layout`-Umgebungen sind Gültigkeitsbereiche, die in diesen obersten Gültigkeitsbereich eingebettet sind.

Sowohl Variablen als auch Gültigkeitsbereiche sind im Guile Modulsystem eingebaut. Ein anonymes Scheme-Modul wird jedem Gültigkeitsbereich angehängt. Eine Zuweisen in der Form von

>     traLaLa = { c'4 d'4 }

wird intern in die Scheme-Definition

>     (define traLaLa Scheme-Wert von `... ')

konvertiert.

Das bedeutet, dass LilyPond-Variablen und Scheme-Variablen frei gemischt werden können. Im folgenden Beispiel wird ein Notenfragment in der Variable `traLaLa` gespeichert und mit Scheme dupliziert. Das Resultat wird in eine `\score`-Umgebung mit einer weiteren Variable `twice` importiert:

    traLaLa = { c'4 d'4 }

    #(define newLa (map ly:music-deep-copy
      (list traLaLa traLaLa)))
    #(define twice
      (make-sequential-music newLa))

    \twice

Das ist ein interessantes Beispiel. Die Zuweisung findet erst statt, nachdem der Parser sichergestellt hat, dass nichts folgt, das Ähnlichkeit mit `\addlyrics` hat, sodass er prüfen muss, was als nächstes kommt. Er liest `#` und den darauf folgenden Scheme-Ausdruck, ohne ihn auszuwerten, so dass er weiterlesen und erst danach wird der Scheme-Code ohne Probleme ausführen kann.

#### LilyPond – Extending v2.24.4 (stabiler Zweig).