Autor Thema: Scheme-Datentypen  (Gelesen 4055 mal)

ingmar

  • Member
Scheme-Datentypen
« am: Sonntag, 22. November 2015, 17:13 »
In diesem Thread listet fugenkomponist die wichtigsten Datentypen, die einem im Alltag so begegnen:
Zitat
boolean? number? string? symbol? integer? list? null? markup? scheme? symbol-list? void? ly:context? ly:duration? ly:event? ly:grob? ly:moment? ly:music? ly:pitch?

...unter den meisten dieser Typen kann ich mir auch durchaus etwas vorstellen. In einigen Fällen wird mir nun auch die Syntax klarer - also der Unterschied zwischen A = { c } (ly:music), A = c (ly:pitch), A = "c" (string). Bis jetzt hätte ich mich nicht getraut, etwa A = c zu schreiben, weil ich vermutet hätte, dass Lilypond versucht, c als Variable aufzulösen. Ich hab also immer string und ly:music ausprobiert, und oft haben beide nicht funktioniert, und ich wusste nicht weiter.

Aber viele weitere Feinheiten bleiben dennoch offen - was ist zum Beispiel der Unterschied zwischen null und void? Oder was sind symbol, ly:event und ly:moment?

In der Notationsreferenz Version A.19 steht die Liste im Anhang A.21, in der Version davor ist es noch Anhang A.20. Aber viel mehr steht dort leider auch nicht. Wo sollte ich weiterlesen?

gruß,
--ingmar
« Letzte Änderung: Sonntag, 22. November 2015, 17:15 von ingmar »

fugenkomponist

  • Member
Re: Scheme-Datentypen
« Antwort #1 am: Sonntag, 22. November 2015, 17:47 »
null? ist (so wie ich das verstehe) kein richtiges Typprädikat, sondern gibt zurück, ob eine Liste leer ist. Es hat also nichts mit void und auch nicht mit null-Pointern (bekannt aus anderen Sprachen wie C/C++ oder Java) zu tun. Hier die Dokumentation.

Ein Symbol ist so eine Art Name, der nicht aufgelöst wird, geschrieben als 'name (mit '). In LilyPond werden z. B. grob properties so erreicht:
(ly:grob-set-property! meingrob 'color blue)Der Vorteil gegenüber Strings ist die bessere Vergleichbarkeit, weil jedes Symbol nur einmal im Speicher liegt (anders als mehrere verschiedene Strings mit gleichem Inhalt). Hier die Dokumentation, die das noch viel ausführlicher erklärt.

ly:event? ist ein PostEvent, z. B. #{ -. #} (ArticulationEvent als Staccato). Man kann nicht nur Musikfunktionen schreiben (per define-music-function), die ly:music? zurückgeben, sondern eben auch Eventfunktionen (z. B. eine Funktion pizz, die ein TextScript setzt und per c\pizz aufgerufen wird).

ly:moment? ist ein Zeitpunkt (manchmal auch eine Zeitdauer, weshalb ich nicht ganz versteh, wozu es ly:duration gibt). So sind z. B. measureLength und measurePosition beide vom Typ ly:moment?.

Ne ausführlichere Dokumentation hab ich bisher auch nicht gefunden. Für die Scheme-eigenen Datentypen kann man halt in die oben verlinkte Dokumentation schauen, LilyPond-Datentypen hab ich einfach irgendwie mit der Zeit kennengelernt. (Mir ist aber z. B. immer noch nicht klar, was ein ly:prob? ist …)

ingmar

  • Member
re: Scheme-Datentypen
« Antwort #2 am: Samstag, 19. Dezember 2015, 13:17 »
Noch eine andere Frage im Zusammenhang damit. Ein leerer String sieht ja so aus: "". Wie würde ein leerer musikalischer Ausdruck aussehen (d.h. einer, der keine Wirkung hat)? Ich brauche das manchmal. Aber { } führt bei mir immer zu Fehlern.

--ingmar

fugenkomponist

  • Member
Re: re: Scheme-Datentypen
« Antwort #3 am: Samstag, 19. Dezember 2015, 13:24 »
Aber { } führt bei mir immer zu Fehlern.
Hast du mal ein Beispiel? Folgendes funktioniert z. B. nämlich einwandfrei:\version "2.19.33"

leer = { }

\relative {
  c' d \leer e f
}

ingmar

  • Member
re: Scheme-Datentypen
« Antwort #4 am: Samstag, 19. Dezember 2015, 13:45 »
Ja, das war wieder ein Fall von Suchen - Suchen - Suchen - Im Forum fragen - Lösung kommt von alleine.

Du hast recht, es funktioniert wunderbar. Mein Fehler war gewesen, den Ausdruck { } innerhalb von Scheme zu verwenden, und das war natürlich falsch. Es hätte #{ #} sein müssen.

Danke, Gruß,
--ingmar

harm6

  • Member
Re: Scheme-Datentypen
« Antwort #5 am: Samstag, 19. Dezember 2015, 14:13 »
Oder auch:
(make-music 'Music)

Gruß,
  Harm

ingmar

  • Member
re: Scheme-Datentypen
« Antwort #6 am: Samstag, 19. Dezember 2015, 16:57 »
Zitat
harm6:Oder auch:
(make-music 'Music)

Danke, das vervollständigt das Bild.

Aber im Ernst würde ich immer #{ #} verwenden, weil da jeder sofort sieht, was gemeint ist. Mit mehr Scheme-Hintergrund würde ich das vielleicht anders sehen, aber heute ziehe ich die leeren Klammern vor.

Gruß,
--ingmar

fugenkomponist

  • Member
Re: Scheme-Datentypen
« Antwort #7 am: Samstag, 19. Dezember 2015, 17:24 »
Ergänzend lässt sich vielleicht noch sagen, dass
    (make-music 'Music)
und
    #{ #}
in Scheme tatsächlich äquivalent sind.

    { }
in LilyPond (nicht Scheme) dagegen ist SequentialMusic, um genau zu sein
    (make-music 'SequentialMusic 'elements '())
In Scheme kriegt man den per
    #{ { } #}

Falls das jetzt zu unübersichtlich war: Einfach mal die Ausgabe des folgenden Codes anschauen ;)\version "2.19.33"

\displayMusic #(make-music 'Music)
\displayMusic ##{ #}

\displayMusic { }
\displayMusic ##{ { } #}

Edit: Das war mir auch neu, wieder was gelernt :)