Hallo,
dieser Beitrag bezieht sich auf
diesen thread.
Hier wird versucht zunächst ein paar fundamentale Sachen zu behandeln.
Zuvor:Die LilyPond-extension-Sprache ist guile!
Man könnte sagen guile ist ein Dialekt von scheme, scheme ist ein Dialekt von lisp.
Um eigene Experimente durchzuführen kann man einen guile-interpreter benutzen.
Auf Linux-systemen einfach ein Terminal öffnen und
guileeingeben, return. (Wie es bei anderen OS funktioniert weiß ich nicht.)
Oder man gibt
lilypond scheme-sandboxein, return, und landet in LilyPonds eigenem Sandkasten.
Anmerkung:
Es gibt aber einen Unterschied zwischen beiden Möglichkeiten: In der sandbox sind einige häufig benutzte module schon aktiviert, zusätzliche module bieten meistens weitere Befehlsmöglichkeiten. Wenn man direkt in den guile-interpreter geht muß man diese zusätzlichen module selbst aktivieren.Falls man solche Experimente in einem lilypond-file durchführen möchte, muß man alle Definitionen mit einem #-Zeichen anfangen lassen.
ListenFast alles in LilyPond ist in Listen organisiert.
(lisp, von dem guile letztlich abstammt, ist die Abkürzung von list-processing)
Ein Beispiel für eine Liste ist '(1 2 3)
Die Schreibweise (list 1 2 3) bedeutet in
diesem Fall dasselbe.
(define ls '(1 2 3))definiert diese Liste als 'ls' mit der sie auch aufgerufen werden kann.
guile> (define ls '(1 2 3))
guile> ls
(1 2 3)Wie kommt man nun an die einzelnen Elemente dieser Liste?
Dazu gibt es fundamentale procedures:
car und
cdrcar kann das erste Element einer Liste ausgeben.
cdr den Rest als neue Liste.
guile> (car ls)
1guile> (cdr ls)
(2 3)Es gibt noch zahreiche Kombinationen von
car und
cdr, die aber letztlich alle auf diese beiden zurückgehen.
Um beispielsweise das zweite Element einer Liste zu erhalten kann man folgendes benutzen:
guile> (car (cdr ls))
2Dafür gibt es praktischerweise aber eine zusammengefasste, kurze Form:
cadrguile> (cadr ls)
2Wenn man jetzt aber eine sehr lange Liste hat, z.B.
(define lange-liste '(1 2 3 4 5 6 7 8 9))und will jetzt das
letzte Element der Liste haben so müßte man
(car (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr lange-liste)))))))))eingeben um es zu erhalten.
Ist natürlich nicht sehr praktikabel.
Man kann aber glücklicherweise diese Häufung von
cdr auf verschiedene Arten vermeiden.
a) Es gibt die
reverse-procedure die eine Liste "umdreht":
guile> (reverse lange-liste)
(9 8 7 6 5 4 3 2 1)
Nun kann man wieder das fundamentale
car benutzen.
guile> (car (reverse lange-liste))
9
b) Es gibt die
last-pair-procedure, die das letzte Element einer Liste als neue Liste ausgibt:
guile> (last-pair lange-liste)
(9)
Jetzt kann man wieder
car brauchen:
guile> (car (last-pair lange-liste))
9
c) Falls man
(use-modules (srfi srfi-1)) benutzt, so gibt es auch die
last-procedure, die das letzte Element direkt ausgibt. (Dann kann man auch
first,
second,
third, ... benutzen.)
srfi-1 ist in LilyPond, sowie in der sandbox standard. Ich benutze
last, etc aber nicht so gerne, da es gelegentlich Probleme gibt, falls man die Musik in Variablen gepackt hat und sie first = { ... }, etc genannt hat.
Falls man direkt den guile-interpreter benutzt, muß man das module selbst integrieren.
guile> (last lange-liste)
9bzw
guile> (use-modules (srfi srfi-1))
guile> (last lange-liste)
9Soviel für diesen Beitrag, Fortsetzung folgt.

Gruß,
Harm