1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
4 Translation of GIT committish: 5cf864d550e7148412d594cf336841791bff6f76
6 When revising a translation, copy the HEAD committish of the
7 version that you are working on. See TRANSLATION for details.
13 @appendix Scheme-Übung
14 @translationof Scheme tutorial
19 @cindex Scheme, in einer LilyPond-Datei
22 LilyPond verwendet die Scheme-Programmiersprache sowohl als Teil
23 der Eingabesyntax als auch als internen Mechanismus, um Programmmodule
24 zusammenzufügen. Dieser Abschnitt ist ein sehr kurzer Überblick über
25 die Dateneingabe mit Scheme. Wenn Sie mehr über Scheme wissen wollen,
26 gehen Sie zu @uref{http://@/www@/.schemers@/.org}.
28 LilyPond benutzt die GNU Guile-Implementation von Scheme, die auf dem
29 @qq{R5RS}-Standard von Scheme basiert. Wenn Sie Scheme lernen wollen,
30 um es innerhalb von LilyPond zu benutzen, wird es nicht empfohlen,
31 mit einer anderen Implementation (die sich auf einen anderen
32 Standard bezieht) zu arbeiten. Information zu Guile findet sich
33 unter @uref{http://www.gnu.org/software/guile/}. Der
34 @qq{R5RS}-Standard von Scheme befindet sich unter der Adresse
35 @uref{http://www.schemers.org/Documents/Standards/R5RS/}.
37 Die LilyPond-Installation enthält gleichzeitig auch die
38 Guile-Implemenation von Scheme. Auf den meisten Systemen kann
39 man in einer Scheme-sandbox experimentieren, indem man ein
40 Kommandozeilen-Fenster öffnet und @code{guile} auffruft. Unter
41 einigen Systemen, insbesondere unter Windows, muss man evtl.
42 die Umgebungsvariable @code{GUILE_LOAD_PATH} auf das Verzeichnis
43 @code{../usr/shr/guile/1.8} innerhalb des LilyPond-Installationsverzeichnisses
44 setzen (der vollständige Pfad ist erklärt in @ref{Other sources of information}).
45 Alternativ können Windows-Benutzer auch einfach @qq{Ausführen} im
46 Startmenü wählen und @code{guile} schreiben.
48 Das Grundlegendste an einer Sprache sind Daten: Zahlen, Zeichen,
49 Zeichenketten, Listen usw. Hier ist eine Liste der Datentypen, die für
50 LilyPond-Eingabedateien relevant sind.
53 @item Boolesche Variablen
54 Werte einer Booleschen Variable sind Wahr oder Falsch. Die Scheme-Entsprechung
55 für Wahr ist @code{#t} und für Falsch @code{#f}.
60 Zahlen werden wie üblich eingegeben, @code{1} ist die (ganze)
61 Zahl Eins, während @code{-1.5} ist eine Gleitkommazahl (also
65 Zeichenketten werden in doppelte Anführungszeichen gesetzt:
68 "Das ist eine Zeichenkette"
71 Zeichenketten können über mehrere Zeilen reichen:
79 Anführungszeichen und neue Zeilen können auch mit sogenannten
80 Fluchtsequenzen eingefügt werden. Die Zeichenkette
81 @code{a sagt "b"} wird wie folgt eingegeben:
87 Neue Zeilen und Backslashe werden mit @code{\n} bzw. @code{\\}
91 In einer Notationsdatei werden kleine Scheme-Abschnitte mit der
92 Raute (@code{#}) eingeleitet. Die vorigen Beispiele heißen also in
98 #"Das ist eine Zeichenkette"
104 LilyPond-Kommentare (@code{%} oder @code{%@{ %@}}) können innerhalb
105 von Scheme-Code nicht benutzt werden. Kommentare in Guile Scheme
106 werden wie folgt notiert:
109 ; Einzeiliges Kommentar
112 Guile-Stil Blockkommentar (nicht schachtelbar)
113 Diese Kommentare werden von Scheme-Programmierern
114 selten benutzt und nie im Quellcode
119 Merere aufeinander folgende Scheme-Ausdrücke in einer Notationsdatei
120 können kombiniert werden, wenn man @code{begin} einsetzt. Das
121 erlaubt es, die Anzahl an Rauten auf eins zu begrenzen.
129 Wenn @code{#} von einer öffnenden Klammer, @code{(}, gefolgt wird, wie
130 in dem Beispiel oben, bleibt der Parser im Scheme-Modus bis eine
131 passende schließende Klammer, @code{)}, gefunden wird, sodass keine
132 weiteren @code{#}-Zeichen benötigt werden, um einen Scheme-Abschnitt
135 Für den Rest dieses Abschnitts nehmen wir an, dass die Daten immer in
136 einer LilyPond-Datei stehen, darum wird immer die Raute verwendet.
138 Scheme kann verwendet werden, um Berechnungen durchzuführen. Es
139 verwendet eine @emph{Präfix}-Syntax. Um 1 und@tie{}2 zu addieren, muss
140 man @code{(+ 1 2)} schreiben, und nicht @math{1+2}, wie in traditioneller
148 Der Pfeil @result{} zeigt an, dass das Ergebnis der Auswertung von
149 @code{(+ 1 2)} @code{3}@tie{}ist. Berechnungen können geschachtelt
150 werden und das Ergebnis einer Berechnung kann für eine neue
151 Berechnung eingesetzt werden.
159 Diese Berechnungen sind Beispiele von Auswertungen. Ein Ausdruck
160 wie @code{(* 3 4)} wird durch seinen Wert @code{12} ersetzt. Ähnlich
161 verhält es sich mit Variablen. Nachdem eine Variable definiert ist:
168 kann man sie in Ausdrücken weiterverwenden:
171 vierundzwanzig = #(* 2 zwoelf)
175 Die 24 wird in der Variablen @code{vierundzwanzig} gespeichert.
176 Die gleiche Zuweisung kann auch vollständig in Scheme geschrieben
180 #(define vierundzwanzig (* 2 zwoelf))
183 Der @emph{Name} einer Variable ist auch ein Ausdruck, genauso wie
184 eine Zahl oder eine Zeichenkette. Er wird wie folgt eingegeben:
191 @cindex Zitieren in Scheme
193 Das Apostroph @code{'} verhindert, dass bei der Scheme-Auswertung
194 @code{vierundzwanzig} durch @code{24} ersetzt wird. Anstatt dessen erhalten
195 wir die Bezeichnung @code{vierundzwanzig}.
197 Diese Syntax wird sehr oft verwendet, weil es manche
198 Einstellungsveränderungen erfordern, dass Scheme-Werte einer
199 internen Variable zugewiesen werden, wie etwa
202 \override Stem #'thickness = #2.6
205 Diese Anweisung verändert die Erscheinung der Notenhälse. Der Wert
206 @code{2.6} wird der Variable @code{thickness} (Dicke) eines
207 @code{Stem}-(Hals)-Objektes gleichgesetzt.
208 @code{thickness} wird relativ zu den Notenlinien errechnet, in diesem
209 Fall sind die Hälse also 2,6 mal so dick wie die Notenlinien. Dadurch
210 werden Hälse fast zweimal so dick dargestellt, wie sie normalerweise sind.
211 Um zwischen Variablen zu unterscheiden, die in den Quelldateien direkt
212 definiert werden (wie @code{vierundzwanzig} weiter oben), und zwischen denen,
213 die für interne Objekte zuständig sind, werden hier die ersteren
214 @qq{Bezeichner} genannt, die letzteren dagegen @qq{Eigenschaften}.
215 Das Hals-Objekt hat also eine @code{thickness}-Eigenschaft, während
216 @code{vierundzwanzig} ein Bezeichner ist.
218 @cindex Eigenschaften versus Bezeichner
219 @cindex Bezeichner versus Eigenschaften
221 Sowohl zweidimensionale Abstände (X- und Y-Koordinaten) als auch
222 Größen von Objekten (Intervalle mit linker und rechter Begrenzung) werden
223 als @code{pairs} (Paare) eingegeben. Ein Paar@footnote{In der
224 Scheme-Terminologie wird ein Paar @code{cons} genannt und seine
225 zwei Elemente @code{car} und @code{cdr}.} wird als @code{(erster . zweiter)}
226 eingegeben und sie müssen mit dem Apostroph eingeleitet werden, genauso
230 \override TextScript #'extra-offset = #'(1 . 2)
233 Hierdurch wird das Paar (1, 2) mit der Eigenschaft @code{extra-offset}
234 des TextScript-Objektes verknüpft. Diese Zahlen werden in
235 Systembreiten gemessen, so dass der Befehl das Objekt eine Systembreite
236 nach rechts verschiebt und zwei Breiten nach oben.
238 Die zwei Elemente eines Paares können von beliebigem Inhalt sein, etwa
243 #'("blah-blah" . 3.14159265)
246 Eine Liste wird eingegeben, indem die Elemente der Liste in Klammern
247 geschrieben werden, mit einem Apostroph davor. Beispielsweise:
254 Die ganze Zeit wurde hier schon Listen benutzt. Eine Berechnung,
255 wie @code{(+ 1 2)}, ist auch eine Liste (welche das Symbol @code{+}
256 und die Nummern 1 und@tie{}2 enthält. Normalerweise werden Listen
257 als Berechnungen interpretiert und der Scheme-Interpreter ersetzt
258 die Liste mit dem Ergebnis der Berechnung. Um eine Liste an sich
259 einzugeben, muss die Auswertung angehalten werden. Das geschieht,
260 indem der Liste ein Apostroph vorangestellt wird. Für Berechnungen
261 kann man also den Apostroph nicht verwenden.
263 Innerhalb einer zitierten Liste (also mit Apostroph) muss man keine
264 Anführungszeichen mehr setzen. Im Folgenden ein Symbolpaar, eine
265 Symbolliste und eine Liste von Listen:
269 #'(staff clef key-signature)
276 * Optimierungen mit Scheme::
279 @node Optimierungen mit Scheme
280 @appendixsec Optimierungen mit Scheme
281 @translationof Tweaking with Scheme
283 Wir haben gesehen wie LilyPond-Eingabe massiv beeinflusst
284 werden kann, indem Befehle wie etwa
285 @code{\override TextScript #'extra-offset = ( 1 . -1)}
286 benutzt werden. Aber es wurde gezeigt, dass Scheme noch
287 mächtiger ist. Eine bessere Erklärung findet sich in der@ref{Scheme-Übung} und in
288 @ruser{Schnittstellen für Programmierer}.
290 Scheme kann auch in einfachen @code{\override}-Befehlen
293 TODO Find a simple example
294 @c This isn't a valid example with skylining
295 @c It works fine without padText -td
298 @lilypond[quote,verbatim,ragged-right]
299 padText = #(define-music-function (parser location padding) (number?)
301 \once \override TextScript #'padding = #$padding
309 c4^"piu mosso" fis a g
314 Es kann auch benutzt werden, um Befehle zu erstellen:
316 @c Check this is a valid example with skylining
317 @c It is - 'padding still works
319 @lilypond[quote,verbatim,ragged-right]
320 tempoPadded = #(define-music-function (parser location padding tempotext)
323 \once \override Score.MetronomeMark #'padding = $padding
324 \tempo \markup { \bold $tempotext }
328 \tempo \markup { "Low tempo" }
330 \tempoPadded #4.0 #"High tempo"
335 Sogar ganze Musikausdrücke können eingefügt werden:
337 @lilypond[quote,verbatim,ragged-right]
338 pattern = #(define-music-function (parser location x y) (ly:music? ly:music?)
345 \pattern {d16 dis} { ais16-> b\p }