scheme arbeitet beim Aufruf einer procedure intern mit Kopien der Argumente. Wenn Du eines dieser Argumente per set! veränderst so ist diese Veänderung auch nur intern sichtbar und somit verarbeitbar.
Hallo Harm und fugenkomponist,
danke für die Mühe, die ihr euch macht.
Ich bin wieder einmal an meiner eigenen Blödheit gescheitert, ich habe in der Definition schlichtweg vergessen, die Variable einzufügen.
Er hätte natürlich heißen müssen
#(define (cColor mycolor)(set! w-key-color (x11-color mycolor)))Der Aufruf mit
#(cColor 'blue)funktioniert jetzt, aber
\cColor #'grey70geht nicht. Dafür müsste ich cColor m.E. als music-function definieren, was zur oben erwähnten Warnmeldung führt, da die Funktion keinen Output liefern, sondern nur die Variable ändern soll.
Harm, ich habe noch eine Frage zur Makrodefinition. Wenn ich z.B. nicht den Variablennamen, sondern white oder black übergeben will, was müsste ich machen? Folgendes funktioniert nicht:
#(define-macro (set-color! target color)
;; nb output is unspecified
`(let* ((keyfarbe (if (eq? ,target 'white) w-key-color b-key-color)))
(set! ,keyfarbe (x11-color ,color))))Update: nach nochmaligem Studium des Lilypond-Scheme-Tutorials bin ich selbst drauf gekommen. Einfach
define-music-function durch
define-scheme-function ersetzen, die Funktion schaut dann so aus:
wColor=#(define-scheme-function (mycolor) (symbol?)
(set! w-key-color (x11-color mycolor)))
....
%% Aufruf:
\wColor #'LightCyan