[ << Scheme-Tutorium ] | [Anfang][Inhalt][Index] | [ Schnittstellen für Programmierer >> ] |
[ < Eingabe-Variablen und Scheme ] | [ Nach oben : Scheme in LilyPond ] | [ Objekteigenschaften > ] |
1.2.4 Scheme in LilyPond importieren
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 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.
Eine weitere Bequemlichkeit können die „listentrennenden“ Operatoren
$@
und #@
bieten, indem sie die Elemente einer Liste
in den umgebenden Kontext einfügen. Wenn man sie einsetzt, hätte der
letzte Teil des Beispiels auch so geschrieben werden können:
... { #@newLa }
Hier wird jedes Element der Liste, welche in newLa
gespeichert ist,
der Reihenfolge nach genommen und in die Liste eingefügt, als ob man
geschrieben hätte:
{ #(first newLa) #(second newLa) }
In allen diesen Formen findet die Auswertung des Scheme-Codes statt, während die Eingabe noch gelesen wird, entweder im Lexer oder im Parser. Wenn man es 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-Tutorium ] | [Anfang][Inhalt][Index] | [ Schnittstellen für Programmierer >> ] |
[ < Eingabe-Variablen und Scheme ] | [ Nach oben : Scheme in LilyPond ] | [ Objekteigenschaften > ] |