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