| [ << 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 > ] | ||