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 }

    %% dummy action to deal with parser lookahead
    #(display "this needs to be here, sorry!")

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

    { \twice }

In diesem Beispiel geschieht die Zuweisung, nachdem der Parser sichergestellt hat, dass nichts interessantes mehr nach `traLaLa = { ... }` passiert. Ohne die Dummy-Aussage in dem Beispiel würde die `newLa`-Definition ausgeführt, bevor `traLaLa` definiert ist, was einen Syntax-Fehler hervorrufen würde.

Das Beispiel zeigt, wie man musikalische Ausdrücke aus der Eingabe in den Scheme-Auswerter „exportieren“ kann. Es geht auch andersherum. Indem man Scheme-Werten in die Funktion `ly:export` einschließt, wird ein Scheme-Wert interpretiert, als ob er in LilyPond-Syntax eingeben wäre. Anstatt `\twice` zu definieren, könne man also auch schreiben:

>     ...
>     { #(ly:export (make-sequential-music (list newLa))) }

Scheme-Code wird sofort interpretiert, wenn der Parser darauf stößt. Um Scheme-Code als Makro zu definieren (das später aufgerufen werden soll), muss man Leere Funktionen benutzen oder

>     #(define (nopc)
>       (ly:set-option 'point-and-click #f))

>     ...
>     #(nopc)
>     { c'4 }

#### Bekannte Probleme und Warnungen

Scheme- und LilyPond-Variablen können nicht gemischt werden, wenn man die `--safe`-Option benutzt.

Andere Sprachen: English, español.

#### LilyPond – Extending