lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Scheme engraver structure questions


From: David Kastrup
Subject: Re: Scheme engraver structure questions
Date: Mon, 26 Dec 2011 20:50:18 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.92 (gnu/linux)

Nicolas Sceaux <address@hidden> 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

reply via email to

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