Wie ruft man eine neue Musikfunktion mit einem String-Argument auf?

Begonnen von Cattleya, Montag, 5. Juli 2021, 15:44

« vorheriges - nächstes »

Cattleya

Hallo!

Das folgende Beispiel definiert eine Funktion SillyFunc, die ein Argument vom Typ string? verarbeitet:

SillyFunc =
#(define-music-function
     (Silly)
     (string?)
   #{
     #Silly
   #})
\relative c''' {
  c4 b a b
  \SillyFunc "c f c"
  \SillyFunc #"c f c"
}


Das Problem ist:

Sowohl der Aufruf  \SillyFunc "c f c"  als auch der Aufruf   \SillyFunc #"c f c" führt auf dem Terminal zu einer Fehlermeldung:

GNU LilyPond 2.18.2
»doof.ly« wird verarbeitet
Analysieren.../usr/share/lilypond/2.18.2/scm/ly-syntax-constructors.scm:56:23: In expression (apply (ly:music-function-extract fun) parser ...):
/usr/share/lilypond/2.18.2/scm/ly-syntax-constructors.scm:56:23: Wrong number of arguments to #<procedure #f (Silly)>


Was mache ich falsch?

Wie ruft man eine Musikfunktion mit String-Argument auf?

harm6

Hallo,

wenn Du wirklich noch 2.18.2 verwendest, müssen die default-Argumente parser und location genannt werden, erst in späteren Versionen können diese weggelassen werden.

Also

\version "2.18.2"

SillyFunc =
#(define-music-function (parser location Silly) (string?)
...)


Allerdings gibt diese music-function keine Musik aus - ich geh mal davon aus, daß das dem minimal-example geschuldet ist.


Gruß,
  Harm

Cattleya

Harm schrieb:

Zitat von: harm6 am Dienstag,  6. Juli 2021, 10:48
wenn Du wirklich noch 2.18.2 verwendest, müssen die default-Argumente parser und location genannt werden, erst in späteren Versionen können diese weggelassen werden.

Vielen herzlichen Dank, Harm!

Manchmal verzweifle ich an mir selbst.  :(   
Hätte selber merken müssen, dass es sich um 2.18.2 handelt!
Steht in der Fehlermeldung ja groß und breit da.

Und in der Doku zu 2.18 unter https://lilypond.org/doc/v2.18/Documentation/notation/substitution-function-syntax steht sogar riesengroß unüberlesbar parser location  drin:

Funktion =
#(define-music-function
     (parser location Arg1 Arg2 ...)
     (Typ1? Typ2? ...)
   #{
     ...Noten...
   #})


Bloß ich hab mal wieder nicht gerafft, dass es, wenn man eine Anleitung über Google sucht, auch auf die richtige Versionsnummer ankommt.  :-[

Damit, dass die Funktion keine Musik ausgibt, hast Du recht. Aber damit, dass das dem Minimalbeispiel geschuldet sei, nicht. Es liegt eher an meiner Blödheit - ich bin nämlich noch dabei, mich einzulernen und spiele mit lilypond vielleicht seit zwei Wochen herum.

Ich hab jetzt den Argumententyp auf ly:music? geändert.