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