[ << 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 } #(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.
Das Beispiel zeigt, wie man musikalische Ausdrücke aus der Eingabe in den
Scheme-Auswerter „exportieren“ kann. Es geht auch andersherum. Indem
man Scheme-Werte nach $
schreibt, wird ein
Scheme-Wert interpretiert, als ob er in LilyPond-Syntax eingeben wäre.
Anstatt \twice
zu definieren, könne man also auch schreiben:
... { $(make-sequential-music (list newLa)) }
Mann kann $
zusammen mit einem Scheme-Ausdruck überall benutzen,
wo auch \Bezeichnung
gültig wäre, nachdem der Scheme-Ausdruck
einmal einer Variable Bezeichnung zugewiesen worden ist. Der Austausch
geschieht im Lexer, sodass LilyPond den Unterschied gar nicht merkt.
Ein negativer Effekt ist aber das Timing. Wenn man $
anstelle von
#
für die Definition von newLa
im obigen Beispiel eingesetzt
hätte, würde der folgende Scheme-Ausdruck fehlschlagen, weil traLaLa
noch nicht definiert worden wäre. Zu einer Erklärung dieses Timingproblems
siehe LilyPond Scheme-Syntax.
Auf jeden Fall findet die Auswertung des Scheme-Codes spätestens im Parser statt. Wenn man es noch später ausgeführt haben möchte, muss man Leere Scheme-Funktionen benutzen oder es in einem Makro speichern:
#(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 > ] |
Andere Sprachen: English, español, français.
About automatic language selection.