Warum überhaupt Scheme?#
Die Programmiersprache Scheme ist ein Abkömmling der Sprache Lisp, der ursprünglich für den Einsatz in Kursen am MIT konzipiert wurde. Von dieser Herkunft bleibt der Sprache ein Fokus auf Konsistenz und Einfachheit bis hin zum Minimalismus.
LilyPond benutzt Scheme als seine Erweiterungssprache. Das ist eine übliche Technik: Der Kern des Programms ist in einer kompilierten Sprache geschrieben (im Fall von LilyPond: in C++). Dieser Kern interagiert mit einer interpretierten Sprache, in unserem Fall Scheme. „Kompilierte Sprache“ bedeutet dabei, dass das Programm einmalig in Maschinencode übersetzt (und in dieser Form ausgeliefert) wird. Dadurch ist das Programm sehr schnell, aber gleichzeitig wird sein Funktionsumfang eingefroren, denn Veränderungen und Erweiterungen können nur vorgenommen werden, indem man den C++-Quelltext modifiziert und das Programm mühsam neu kompiliert. Bei einer interpretierten Sprache dagegen wird direkt der vom Menschen geschriebene Programmcode ausgeführt („interpretiert“). Das macht es möglich, solchen Code direkt in eine LilyPond-Datei aufzunehmen und bequem zu verändern, so dass die Veränderungen sich in der Datei sofort auswirken, ohne dass man die technische Infrastruktur zum Kompilieren des gesamten Programms zur Verfügung haben muss.
Tatsächlich benutzt LilyPond Scheme nicht nur als Erweiterungssprache, sondern auch als Programmiersprache für einen großen Teil seiner internen Abläufe: genau das ist der Grund für seine atemberaubende Erweiterbarkeit. Aus Benutzersicht ermöglicht das viele Anwendungen, von bequemeren ad-hoc-Eingabeerleichterungen bis hin zu komplett neuartigen graphischen Notationsweisen für die Werke eines bestimmten Komponisten.
Auch abseits so fortgeschrittener Anwendungen sind grundlegende Scheme-Kenntnisse für jede:n LilyPond-Nutzer:in nützlich, da ja Scheme-Fragmente buchstäblich überall in typischem LilyPond-Code vorkommen. Einige Beispiele:
title = ##f
\override NoteHead.style = #'cross
\shape #'((0 . 0) (0.1 . 0.3) (0.1 . 0.5) (0 . 1.0)) Slur
\override Staff.TupletBracket.direction = #DOWN
Beachten Sie aber, dass es nicht nur eine einzige Scheme-Implementierung gibt: Tatsächlich sind es dutzende, von denen jede ihre eigenen Stärken und Besonderheiten hat. LilyPond nutzt die Scheme-Implementierung Guile, weil diese die offizielle Erweiterungssprache des GNU-Projekts ist, zu dem auch LilyPond gehört. Der Name „Guile“ (engl. „List“, „Tücke“) ist ein Akronym für „GNU Ubiquitous Intelligent Language for Extensions“, also ungefähr „allgegenwärtige intelligente Erweiterungssprache des GNU-Projektes“. („Allgegenwärtig“ ist eher Wunschdenken; inwieweit „intelligent“ zutrifft, mögen die Leser:innen selbst entscheiden.)
Please also bear in mind that the version of Guile embedded in LilyPond is generally not the latest version of Guile. At the time of this writing, the latest stable Guile release series is Guile 3.0. On the other hand, LilyPond’s stable release series, the 2.24 series, uses Guile 2.2, of which the manual is here.