1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
4 Translation of GIT committish: 5131c3292d30cabdf08839daa02a006e4d3c96c5
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 Das Grundlegendste an einer Sprache sind Daten: Zahlen, Zeichen,
29 Zeichenketten, Listen usw. Hier ist eine Liste der Datentypen, die für
30 LilyPond-Eingabedateien relevant sind.
33 @item Boolesche Variablen
34 Werte einer Booleschen Variable sind Wahr oder Falsch. Die Scheme-Entsprechung
35 für Wahr ist @code{#t} und für Falsch @code{#f}.
40 Zahlen werden wie üblich eingegeben, @code{1} ist die (ganze)
41 Zahl Eins, während @code{-1.5} ist eine Gleitkommazahl (also
45 Zeichenketten werden in doppelte Anführungszeichen gesetzt:
48 "Das ist eine Zeichenkette"
51 Zeichenketten können über mehrere Zeilen reichen:
59 Anführungszeichen und neue Zeilen können auch mit sogenannten
60 Fluchtsequenzen eingefügt werden. Die Zeichenkette
61 @code{a sagt "b"} wird wie folgt eingegeben:
67 Neue Zeilen und Backslashe werden mit @code{\n} bzw. @code{\\}
71 In einer Notationsdatei werden kleine Scheme-Abschnitte mit der
72 Raute (@code{#}) eingeleitet. Die vorigen Beispiele heißen also in
78 #"Das ist eine Zeichenkette"
84 Für den Rest dieses Abschnitts nehmen wir an, dass die Daten immer in
85 einer LilyPond-Datei stehen, darum wird immer die Raute verwendet.
87 Scheme kann verwendet werden, um Berechnungen durchzuführen. Es
88 verwendet eine @emph{Präfix}-Syntax. Um 1 und@tie{}2 zu addieren, muss
89 man @code{(+ 1 2)} schreiben, und nicht @math{1+2}, wie in traditioneller
97 Der Pfeil @result{} zeigt an, dass das Ergebnis der Auswertung von
98 @code{(+ 1 2)} @code{3}@tie{}ist. Berechnungen können geschachtelt
99 werden und das Ergebnis einer Berechnung kann für eine neue
100 Berechnung eingesetzt werden.
108 Diese Berechnungen sind Beispiele von Auswertungen. Ein Ausdruck
109 wie @code{(* 3 4)} wird durch seinen Wert @code{12} ersetzt. Ähnlich
110 verhält es sich mit Variablen. Nachdem eine Variable definiert ist:
117 kann man sie in Ausdrücken weiterverwenden:
120 vierundzwanzig = #(* 2 zwoelf)
124 Die 24 wird in der Variablen @code{vierundzwanzig} gespeichert.
125 Die gleiche Zuweisung kann auch vollständig in Scheme geschrieben
129 #(define vierundzwanzig (* 2 zwoelf))
132 Der @emph{Name} einer Variable ist auch ein Ausdruck, genauso wie
133 eine Zahl oder eine Zeichenkette. Er wird wie folgt eingegeben:
140 @cindex Zitieren in Scheme
142 Das Apostroph @code{'} verhindert, dass bei der Scheme-Auswertung
143 @code{vierundzwanzig} durch @code{24} ersetzt wird. Anstatt dessen erhalten
144 wir die Bezeichnung @code{vierundzwanzig}.
146 Diese Syntax wird sehr oft verwendet, weil es manche
147 Einstellungsveränderungen erfordern, dass Scheme-Werte einer
148 internen Variable zugewiesen werden, wie etwa
151 \override Stem #'thickness = #2.6
154 Diese Anweisung verändert die Erscheinung der Notenhälse. Der Wert
155 @code{2.6} wird der Variable @code{thickness} (Dicke) eines
156 @code{Stem}-(Hals)-Objektes gleichgesetzt.
157 @code{thickness} wird relativ zu den Notenlinien errechnet, in diesem
158 Fall sind die Hälse also 2,6 mal so dick wie die Notenlinien. Dadurch
159 werden Hälse fast zweimal so dick dargestellt, wie sie normalerweise sind.
160 Um zwischen Variablen zu unterscheiden, die in den Quelldateien direkt
161 definiert werden (wie @code{vierundzwanzig} weiter oben), und zwischen denen,
162 die für interne Objekte zuständig sind, werden hier die ersteren
163 @qq{Bezeichner} genannt, die letzteren dagegen @qq{Eigenschaften}.
164 Das Hals-Objekt hat also eine @code{thickness}-Eigenschaft, während
165 @code{vierundzwanzig} ein Bezeichner ist.
167 @cindex Eigenschaften versus Bezeichner
168 @cindex Bezeichner versus Eigenschaften
170 Sowohl zweidimensionale Abstände (X- und Y-Koordinaten) als auch
171 Größen von Objekten (Intervalle mit linker und rechter Begrenzung) werden
172 als @code{pairs} (Paare) eingegeben. Ein Paar@footnote{In der
173 Scheme-Terminologie wird ein Paar @code{cons} genannt und seine
174 zwei Elemente @code{car} und @code{cdr}.} wird als @code{(erster . zweiter)}
175 eingegeben und sie müssen mit dem Apostroph eingeleitet werden, genauso
179 \override TextScript #'extra-offset = #'(1 . 2)
182 Hierdurch wird das Paar (1, 2) mit der Eigenschaft @code{extra-offset}
183 des TextScript-Objektes verknüpft. Diese Zahlen werden in
184 Systembreiten gemessen, so dass der Befehl das Objekt eine Systembreite
185 nach rechts verschiebt und zwei Breiten nach oben.
187 Die zwei Elemente eines Paares können von beliebigem Inhalt sein, etwa
192 #'("blah-blah" . 3.14159265)
195 Eine Liste wird eingegeben, indem die Elemente der Liste in Klammern
196 geschrieben werden, mit einem Apostroph davor. Beispielsweise:
203 Die ganze Zeit wurde hier schon Listen benutzt. Eine Berechnung,
204 wie @code{(+ 1 2)}, ist auch eine Liste (welche das Symbol @code{+}
205 und die Nummern 1 und@tie{}2 enthält. Normalerweise werden Listen
206 als Berechnungen interpretiert und der Scheme-Interpreter ersetzt
207 die Liste mit dem Ergebnis der Berechnung. Um eine Liste an sich
208 einzugeben, muss die Auswertung angehalten werden. Das geschieht,
209 indem der Liste ein Apostroph vorangestellt wird. Für Berechnungen
210 kann man also den Apostroph nicht verwenden.
212 Innerhalb einer zitierten Liste (also mit Apostroph) muss man keine
213 Anführungszeichen mehr setzen. Im Folgenden ein Symbolpaar, eine
214 Symbolliste und eine Liste von Listen:
218 #'(staff clef key-signature)
225 * Optimierungen mit Scheme::
228 @node Optimierungen mit Scheme
229 @appendixsec Optimierungen mit Scheme
230 @translationof Tweaking with Scheme
232 Wir haben gesehen wie LilyPond-Eingabe massiv beeinflusst
233 werden kann, indem Befehle wie etwa
234 @code{\override TextScript #'extra-offset = ( 1 . -1)}
235 benutzt werden. Aber es wurde gezeigt, dass Scheme noch
236 mächtiger ist. Eine bessere Erklärung findet sich in der@ref{Scheme-Übung} und in
237 @ruser{Schnittstellen für Programmierer}.
239 Scheme kann auch in einfachen @code{\override}-Befehlen
242 TODO Find a simple example
243 @c This isn't a valid example with skylining
244 @c It works fine without padText -td
247 @lilypond[quote,verbatim,ragged-right]
248 padText = #(define-music-function (parser location padding) (number?)
250 \once \override TextScript #'padding = #$padding
258 c4^"piu mosso" fis a g
263 Es kann auch benutzt werden, um Befehle zu erstellen:
265 @c Check this is a valid example with skylining
266 @c It is - 'padding still works
268 @lilypond[quote,verbatim,ragged-right]
269 tempoPadded = #(define-music-function (parser location padding tempotext)
272 \once \override Score.MetronomeMark #'padding = $padding
273 \tempo \markup { \bold $tempotext }
277 \tempo \markup { "Low tempo" }
279 \tempoPadded #4.0 #"High tempo"
284 Sogar ganze Musikausdrücke können eingefügt werden:
286 @lilypond[quote,verbatim,ragged-right]
287 pattern = #(define-music-function (parser location x y) (ly:music? ly:music?)
294 \pattern {d16 dis} { ais16-> b\p }