[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Scheme engraver structure questions
From: |
Nicolas Sceaux |
Subject: |
Re: Scheme engraver structure questions |
Date: |
Tue, 9 Feb 2010 21:13:29 +0100 |
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
}
}
I'm using these macros to experiment with scheme engravers. Although
the syntax is not the most eleguant, and can be improved, it make things
a bit more readable.
%%%
%%% Engraver definition utilities
%%%
#(define-macro (define-engraver name)
`(define ,name (list)))
#(define-macro (define-engraver-method engraver method arg-list . body)
`(set! ,engraver
(cons (cons ',method (lambda ,arg-list ,@body))
,engraver)))
#(define-macro (define-engraver-alist-method engraver key1 key2 arg-list . body)
(let ((assoc-result (gensym))
(methods (gensym)))
`(let* ((,assoc-result (assq ',key1 ,engraver))
(,methods (if ,assoc-result
(cdr ,assoc-result)
(list))))
(set! ,engraver
(assoc-set! ,engraver
',key1
(assoc-set! ,methods
',key2
(lambda ,arg-list ,@body)))))))
#(define-macro (define-engraver-listener engraver event-type arg-list . body)
`(define-engraver-alist-method ,engraver listeners ,event-type ,arg-list
,@body))
#(define-macro (define-engraver-acknowledger engraver interface arg-list . body)
`(define-engraver-alist-method ,engraver acknowledgers ,interface ,arg-list
,@body))
#(define-macro (define-engraver-end-acknowledger engraver interface arg-list .
body)
`(define-engraver-alist-method ,engraver end-acknowledgers ,interface
,arg-list ,@body))
Nicolas