Hallo Xaver,
Aber du hast ja jetzt eine prima Lösung gepostet. Könntest du genau diesen Teil später nochmal genauer kommentieren?
[...]
Mich interessiert, was die Konstruktion mit quasiquote und ,my-ev aus my-ev macht. Ich konnte my-ev nicht abfangen und erhielt bei (display my-ev) einen Fehler. Welche ein Typ ist das?
Lass uns mal ein einfacheres Beispiel betrachten. Einen simplen listener. Er soll solch eine Variable annehmen, als Ausgabe nur melden, falls eine Note gefunden wurde.
Man sollte sich klar machen, daß ein engraver erstmal nur eine Liste ist, die via \consist in einen Context eingefügt wird.
Das make-engraver-makro vereinfacht die Syntax, vernebelt aber die Basis...
Im Code unten habe ich 3 solche engraver definiert.
test-engr benutzt make-engraver
test-I-engr verwendet eine direkt sichtbare Liste aber die Kürzel für quote, quasiquote und unquote
test-II-engr verwendet `list` und `cons` um die Liste zu erstellen quote nur für tatsächliche symbols
Alle drei greifen auf ein vordefiniertes symbol zu, `ev`, versuchen es zu verarbeiten und ins terminal zu schreiben.
Resultat:
Der erste, mit make-engraver erstellte scheitert. Die beiden anderen funktionieren.
Konsequenzen:
(1) Beim Vergleich von test-I-engr mit test-II-engr sollte klar werden, daß das unquote wirklich nur eben das macht. De Versuch es im Terminal anzeigen zu lassen sollte an geeigneter Stelle erfolgen.
(2) test-engr mit make-engraver ist gescheitert die Variable zu nutzen.
make-engraver ist ein noch nicht so altes makro und wird von nicht vielen Personen verwendet. Es ist nicht überraschend, daß man irgendwann eine Schwäche findet.
Ich werde dieses Problem mal auf der devel-mailing-list vorstellen.
Hier der Testcode:
\version "2.19.52"
#(define ev 'note-event)
#(define test-engr
(lambda (context)
(make-engraver
(listeners
(
(ev engraver event)
;(note-event engraver event)
(write ev)
(format #t "\n\nnote-event found from control-engraver\n"))))))
#(define test-I-engr
(lambda (context)
`((listeners
(
,ev
;note-event
.
,(lambda (engraver event)
(write ev)
(format #t "\n\nnote-event found from test-I-engraver\n")))))))
#(define test-II-engr
(lambda (context)
(list
(cons 'listeners
(list
(cons
ev
;'note-event
(lambda (engraver event)
(write ev)
(format #t "\n\nnote-event found from test-II-engraver\n"))))))))
\layout {
\context {
\Voice
\consists #test-engr
\consists #test-I-engr
\consists #test-II-engr
}
}
{
c'4
}
HTH,
Harm