]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/de/extending/scheme-tutorial.itely
Merge branch 'master' of ssh://git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / Documentation / de / extending / scheme-tutorial.itely
1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*-
2
3 @ignore
4     Translation of GIT committish: 5cf864d550e7148412d594cf336841791bff6f76
5
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..
9 @end ignore
10
11 @c \version "2.12.0"
12
13 @node Scheme-Übung
14 @appendix Scheme-Übung
15 @translationof Scheme tutorial
16
17 @funindex #
18 @cindex Scheme
19 @cindex GUILE
20 @cindex Scheme, in einer LilyPond-Datei
21 @cindex LISP
22
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}.
28
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/}.
37
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.
48
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.
52
53 @table @asis
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}.
57 @funindex ##t
58 @funindex ##f
59
60 @item Zahlen
61 Zahlen werden wie üblich eingegeben, @code{1} ist die (ganze) 
62 Zahl Eins, während @code{-1.5} ist eine Gleitkommazahl (also 
63 eine nicht-ganze).
64
65 @item Zeichenketten
66 Zeichenketten werden in doppelte Anführungszeichen gesetzt:
67
68 @example
69 "Das ist eine Zeichenkette"
70 @end example
71
72 Zeichenketten können über mehrere Zeilen reichen:
73
74 @example
75 "Das
76 ist
77 eine Zeichenkette"
78 @end example
79
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:
83
84 @example
85 "a sagt \"b\""
86 @end example
87
88 Neue Zeilen und Backslashe werden mit @code{\n} bzw. @code{\\}
89 eingegeben.
90 @end table
91
92 In einer Notationsdatei werden kleine Scheme-Abschnitte mit der 
93 Raute (@code{#}) eingeleitet. Die vorigen Beispiele heißen also in 
94 LilyPond:
95
96 @example
97 ##t ##f
98 #1 #-1.5
99 #"Das ist eine Zeichenkette"
100 #"Das
101 ist
102 eine Zeichenkette"
103 @end example
104
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:
108
109 @example
110 ; Einzeiliges Kommentar
111
112 #!
113   Guile-Stil Blockkommentar (nicht schachtelbar)
114   Diese Kommentare werden von Scheme-Programmierern
115   selten benutzt und nie im Quellcode
116   von LilyPond
117 !#
118 +@end example
119
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.
123
124 @example
125 #(begin
126   (define foo 0)
127   (define bar 1))
128 @end example
129
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
134 anzuzeigen.
135
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.
138
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
142 Mathematik.
143
144 @lisp
145 #(+ 1 2)
146   @result{} #3
147 @end lisp
148
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.
153
154 @lisp
155 #(+ 1 (* 3 4))
156   @result{} #(+ 1 12)
157   @result{} #13
158 @end lisp
159
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:
163
164 @example
165 zwoefl = #12
166 @end example
167
168 @noindent
169 kann man sie in Ausdrücken weiterverwenden:
170
171 @example
172 vierundzwanzig = #(* 2 zwoelf)
173 @end example
174
175 @noindent
176 Die 24 wird in der Variablen @code{vierundzwanzig} gespeichert.
177 Die gleiche Zuweisung kann auch vollständig in Scheme geschrieben 
178 werden:
179
180 @example
181 #(define vierundzwanzig (* 2 zwoelf))
182 @end example
183
184 Der @emph{Name} einer Variable ist auch ein Ausdruck, genauso wie 
185 eine Zahl oder eine Zeichenkette. Er wird wie folgt eingegeben:
186
187 @example
188 #'vierundzwanzig
189 @end example
190
191 @funindex #'symbol
192 @cindex Zitieren in Scheme
193
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}.
197
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
201
202 @example
203 \override Stem #'thickness = #2.6
204 @end example
205
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.
218
219 @cindex Eigenschaften versus Bezeichner
220 @cindex Bezeichner versus Eigenschaften
221
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 
228 wie Symbole:
229
230 @example
231 \override TextScript #'extra-offset = #'(1 . 2)
232 @end example
233
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.
238
239 Die zwei Elemente eines Paares können von beliebigem Inhalt sein, etwa
240
241 @example
242 #'(1 . 2)
243 #'(#t . #f)
244 #'("blah-blah" . 3.14159265)
245 @end example
246
247 Eine Liste wird eingegeben, indem die Elemente der Liste in Klammern 
248 geschrieben werden, mit einem Apostroph davor. Beispielsweise:
249
250 @example
251 #'(1 2 3)
252 #'(1 2 "string" #f)
253 @end example
254
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.
263
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:
267
268 @example
269 #'(stem . head)
270 #'(staff clef key-signature)
271 #'((1) (2))
272 @end example
273
274
275
276 @menu
277 * Optimierungen mit Scheme::
278 @end menu
279
280 @node Optimierungen mit Scheme
281 @appendixsec Optimierungen mit Scheme
282 @translationof Tweaking with Scheme
283
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}.
290
291 Scheme kann auch in einfachen @code{\override}-Befehlen
292 benutzt werden:
293
294 TODO Find a simple example
295 @c This isn't a valid example with skylining
296 @c It works fine without padText  -td
297
298 @ignore
299 @lilypond[quote,verbatim,ragged-right]
300 padText = #(define-music-function (parser location padding) (number?)
301 #{
302   \once \override TextScript #'padding = #$padding
303 #})
304
305 \relative c''' {
306   c4^"piu mosso" b a b
307   \padText #1.8
308   c4^"piu mosso" d e f
309   \padText #2.6
310   c4^"piu mosso" fis a g
311 }
312 @end lilypond
313 @end ignore
314
315 Es kann auch benutzt werden, um Befehle zu erstellen:
316
317 @c Check this is a valid example with skylining
318 @c It is - 'padding still works
319
320 @lilypond[quote,verbatim,ragged-right]
321 tempoPadded = #(define-music-function (parser location padding tempotext)
322   (number? string?)
323 #{
324   \once \override Score.MetronomeMark #'padding = $padding
325   \tempo \markup { \bold $tempotext }
326 #})
327
328 \relative c'' {
329   \tempo \markup { "Low tempo" }
330   c4 d e f g1
331   \tempoPadded #4.0 #"High tempo"
332   g4 f e d c1
333 }
334 @end lilypond
335
336 Sogar ganze Musikausdrücke können eingefügt werden:
337
338 @lilypond[quote,verbatim,ragged-right]
339 pattern = #(define-music-function (parser location x y) (ly:music? ly:music?)
340 #{
341   $x e8 a b $y b a e
342 #})
343
344 \relative c''{
345   \pattern c8 c8\f
346   \pattern {d16 dis} { ais16-> b\p }
347 }
348 @end lilypond
349
350