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 }
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.