LilyPond erweitern: 1.2.4 Scheme in LilyPond importieren

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

#### LilyPond – Extending v2.22.2 (stabiler Zweig).