Nicolas Sceaux <nicolas.sce...@gmail.com> writes: > Le 9 févr. 2010 à 14:42, David Kastrup a écrit : > >> I find that syntax tiresome to read. It requires evaluation and thus >> does not have a close correspondence to print syntax. >> >> That's partly because of the way the Scheme engraver example has been >> written. >> >> I'd much prefer it to use backquote syntax, such as > > A real improvement would be to add syntax to define scheme engravers, > something like: > > #(define-engraver example-engraver) > > #(define-engraver-method example-engraver initialize (trans) > (display (list "initialize" > (ly:context-current-moment > (ly:translator-context trans)) "\n"))) > > #(define-engraver-listener example-engraver rest-event (engraver event) > (let* ((x (ly:engraver-make-grob engraver 'TextScript event))) > (display (list "caught event" event "\ncreate:\n" x "\n")) > (ly:grob-set-property! x 'text "hi"))) > > \layout { > \context { > \Voice \consists #example-engraver > } > }
Actually, what about the following rather minimalistic approach?
#(define-macro (make-engraver . translist) (define (make-lambdas translist) `(list ,@(map (lambda (x) (if (pair? (car x)) `(cons ',(caar x) (lambda ,(cdar x) ,@(cdr x))) `(cons ',(car x) ,(make-lambdas (cdr x))))) translist))) (make-lambdas translist)) \header { texidoc = "\\consists can take a scheme alist as arguments, which should be functions, which will be invoked as engraver functions." } \version "2.14.0" \layout { \context { \Voice \consists #(make-engraver ((initialize trans) (display (list "initialize" (ly:context-current-moment (ly:translator-context trans)) "\n"))) ((start-translation-timestep trans) (display (list "start-trans" (ly:context-current-moment (ly:translator-context trans)) "\n"))) (listeners ((rest-event engraver event) (let* ((x (ly:engraver-make-grob engraver 'TextScript event))) (display (list "caught event" event "\ncreate:\n" x "\n")) (ly:grob-set-property! x 'text "hi")))) (acknowledgers ((note-head-interface engraver grob source-engraver) (display (list "saw head: " grob " coming from " source-engraver)))) (end-acknowledgers ((beam-interface engraver grob source-engraver) (display (list "saw end of beam: " grob " coming from " source-engraver)))) ((process-music trans) (display (list "process-music" (ly:context-current-moment (ly:translator-context trans)) "\n"))) ((process-acknowledged trans) (display (list "process-acknowledged" (ly:context-current-moment (ly:translator-context trans)) "\n"))) ((stop-translation-timestep trans) (display (list "stop-trans" (ly:context-current-moment (ly:translator-context trans)) "\n"))) ((finalize trans) (display (list "finalize" (ly:context-current-moment (ly:translator-context trans)) "\n")))) }} \relative c' { c8[ r c] }
-- David Kastrup
_______________________________________________ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel