lilypond-devel
[Top][All Lists]
Advanced

[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







reply via email to

[Prev in Thread] Current Thread [Next in Thread]