Hallo Ingmar,
zwei Probleme seh' ich hier. Heutzutage kann man innerhalb eines ly-files lily-code in guile einbetten, und umgekehrt und verschachtelt.
Du mußt in der jeweils aktuellen Umgebung die dan gültigen Mechanismen zum Aufruf eines Wertes verwenden und natürlich auch sicherstellen, daß dieser Wert auch (falls gewünscht) evaluiert wird.
Z.B. (alles in einem ly-file):
(1)MUSIC = \relative { c' d e f g1 }
kann
innerhalb von guile nicht mittels \MUSIC aufgerufen werden:
#(display-scheme-music \MUSIC)
=>
Zitat von: terminalerror: GUILE signaled an error for the expression beginning here
#
(write \MUSIC)
Unbound variable: \MUSIC
Um ly-code in guile einzubetten gibts ja #{ #}
#(display-scheme-music #{ \MUSIC #})
funktioniert.
Aber das kann man einfacher haben, da ly-Definitionen in ly-files in guile direkt aufrufbar sind. d.h.:
#(display-scheme-music MUSIC)
ist einfacher.
(2)Ein musikalischer Ausdruck, wie { a1 }, also keine Variable, wird von guile nur dann verstanden, wenn #{#} drum rum ist:
#(display-scheme-music #{ { a1 } #})
(3)Eine Liste wie '(a b c) wird von guile buchstaben getreu verstanden.
Wenn Du etwas aus dieser Liste rausholst, wird das auch nur buchstabengetreu gemacht:
#(display-scheme-music (cdar (list '(meine-musik . MUSIC))))
gibt 'MUSIC zurück, ein symbol, nicht aber den evaluierten Wert der ly-Definition für MUSIC, die beiden haben nichts miteinander zu tun!
Wobei 'Music (quote MUSIC) entspricht.
Du kannst aber guile die
Möglichkeit geben Werte zu evaluieren: mittels 'quasiquote'. Der Wert den Du tatsächlich evaluiert haben willst muß dann noch ein 'unquote' bekommen:
#(display-scheme-music (quasiquote (unquote MUSIC)))
Dafür gibts allerdings shortcuts in guile
` ist quasiquote
, ist unquote
Obiges kann man also auch so schreiben:
#(display-scheme-music `(,MUSIC))
(4)Beim Aufruf Deiner Funktion mußt Du diese Punkte beachten.
In #(list '(meine-musik . \MUSIC)) ist \MUSIC ein symbol ohne weitere Relevanz.
Während #(list `(meine-musik . ,MUSIC)) MUSIC evaluiert.
In #(list '(meine-musik . { a1 })) ist { a1 } für guile völlig unverständlich.
Während in #(list `(meine-musik . ,#{ { a1 } #})) ein in guile korrekt eingebetteter musikalischer Ausdruck evaluiert wird.
Man kann das ganze noch ein bißchen kürzer schreiben (das komplette Beispiel):
FOO = #(define-music-function (meine-liste) (list?)
(assq-ref meine-liste 'meine-musik))
MUSIC = \relative { c' d e f g1 }
\score { \FOO #`((meine-musik . ,MUSIC)) }
\score { \FOO #`((meine-musik . ,#{ { a1 } #}))}
HTH,
Harm