B.2.1 Eingabevariablen und Scheme

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

traLaLa = { c'4 d'4 }

Der Geltungsbereich von Variablen ist beschränkt: im folgenden Beispiel enthält die \layout-Umgebung auch eine traLaLa-vVariable, die unabhängig von der äußeren \traLaLa-Variable ist:

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

Grundsätzlich ist jede Eingabedatei ein Geltungsbereich, und alle \header-, \midi- und \layout-Umgebungen sind Geltungsbereiche, die unterhalb des globalen Geltungsbereiches angeordnet sind.

Sowohl Variablen als auch Geltungsbereiche sind in Form des GUILE-Modulsystems implementiert. Ein anonymes Scheme-Modul wird an jeden Geltunsbereich angehängt. Eine Zuweisung der form

traLaLa = { c'4 d'4 }

wird intern in die Scheme-Definition

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

umgewandelt.

Das bedeutet, dass Eingabe- und Scheme-Variablen frei vermischt werden können. Im nächsten Beispiel wird ein Notenfragment in der Variable traLaLa gespeichert und mithilfe von Schme dupliziert. Das Ergebnis wird in eine \score-Umgebung mit der zweiten Variable twice integriert:

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 }

[image of music]

In diesem Beispiel geschieht die Zuweisung, nachdem der Parser festgestellt hat, dass nichts interessantes mehr nach traLaLa = { ... } vorkommt. Ohne die Pseudovariable in dem Beispiel würde die newLa-Devinition ausgeführt werden, bevor traLaLa definiert ist, was zu einem Syntax-Fehler führen würde.

Das obige Beispiel zeigt, wie man musikalische Ausdrücke von der Eingabe in den Scheme-Interpretierer „exportieren“ kann. Es geht auch in die andere Richtung. Indem man einen Scheme-Wert in die Funktion ly:export einpackt, wird der Scheme-Wert interpretiert als ob er in LilyPond-Syntax notiert worden wäre. Anstatt \twice zu definieren, hätte man also auch schreiben können:

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

Scheme-Code wird sofort ausgewertet, wenn der Parser darauf stößt. Um Scheme-Code in einem Makro zu definieren (das dann erst später aufgerufen werden soll), müssen leere Funktionen benutzt werden (siehe Leere Funktionen) oder das Folgende:

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

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

Bekannte Probleme und Warnungen

Scheme- und LilyPond-Variablen können im LilyPond-Modus mit der --safe-Option nicht vermischt werden.


Andere Sprachen: English, español.

LilyPond – Extending