Autor Thema: scheme - very basic  (Gelesen 3256 mal)

harm6

  • Member
scheme - very basic
« am: Samstag, 3. Mai 2014, 22:21 »
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.

Listen
Fast 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 cdr
car kann das erste Element einer Liste ausgeben. cdr den Rest als neue Liste.
guile> (car ls)
1

guile> (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))
2

Dafür gibt es praktischerweise aber eine zusammengefasste, kurze Form: cadr
guile> (cadr ls)
2

Wenn 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)
9
bzw
guile> (use-modules (srfi srfi-1))
guile> (last lange-liste)
9


Soviel für diesen Beitrag, Fortsetzung folgt. :)

Gruß,
  Harm

Manuela

  • Member
Re: scheme - very basic
« Antwort #1 am: Freitag, 4. März 2016, 07:29 »
Jetzt möchte ich diesen Thread wieder ausgraben  ;)

Das ist ein sehr nützlicher Beitrag, leider ist die versprochene Fortsetzung ausgeblieben. Vll. kann man auch einen neuen Thread starten.

Was ich mir wünschen würde: kurze, leicht verständliche Beispiele für Scheme + Lilypond, die man dann selbst zusammenbauen / ändern kann

z.B. wie eruiere ich die Anzahl der Einträge einer Liste (das habe ich schon herausgefunden  :D )

oder wie eruiere ich die Anzahl der Noten in einem Lilypond-Musik-Ausdruck, Schritt für Schritt beschrieben