[ << Scheme-Übung ] | [Anfang][Inhalt][Index][ ? ] | [ Schnittstellen für Programmierer >> ] | ||
[ < LilyPond-Variablen ] | [ Nach oben : Scheme in LilyPond ] | [ Objekteigenschaften > ] |
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.
[ << Scheme-Übung ] | [Anfang][Inhalt][Index][ ? ] | [ Schnittstellen für Programmierer >> ] | ||
[ < LilyPond-Variablen ] | [ Nach oben : Scheme in LilyPond ] | [ Objekteigenschaften > ] |