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: Tue, 09 Feb 2010 14:42:31 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.90 (gnu/linux)

Eric Knapp <address@hidden> writes:

> I'm learning more Scheme. (I think I'll be learning Scheme for a
> while.) I'm looking at the sample file scheme-engraver.ly and I have a
> few questions. I think I'm understanding the structure of the Scheme,
> it appears to be a list of Scheme pairs. Each pair (cons) has a symbol
> that starts with an apostrophe and a lambda function or a list of more
> pairs of lambda functions. I'm familiar with symbols in Ruby and I'm
> assuming they are similar in Scheme. The pairs correspond to a method
> or macro in a C++ engraver class. Examples would be:
>
> C++: virtual void initialize ()
> Scheme: (cons 'initialize (lambda (trans)...))
>
> C++: IMPLEMENT_TRANSLATOR_LISTENER (Engraver_name, event_name)
> Scheme: (cons 'listeners (list (cons 'rest-event ...)))
>
> C++: DECLARE_ACKNOWLEDGER (note_head)
> Scheme: (cons 'acknowledgers (list  (cons 'note-head-interface ...)))
>
> Am I on the right track up to this point?

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

diff --git a/input/regression/scheme-engraver.ly 
b/input/regression/scheme-engraver.ly
index ae87b10..68b3443 100644
--- a/input/regression/scheme-engraver.ly
+++ b/input/regression/scheme-engraver.ly
@@ -11,62 +11,53 @@
   \context {
     \Voice
     \consists
-    #(list
-      (cons 'initialize
-       (lambda (trans)
-       (display (list "initialize"
-                 (ly:context-current-moment
-                  (ly:translator-context trans)) "\n"))))
-      (cons 'start-translation-timestep
-       (lambda (trans)
-       (display (list "start-trans"
-                 (ly:context-current-moment
-                  (ly:translator-context trans)) "\n"))))
-      (cons 'listeners
-       (list
-       (cons 'rest-event (lambda (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"))
-                          ))
-       ))
-      (cons 'acknowledgers
-       (list
-       (cons 'note-head-interface
-        (lambda (engraver grob source-engraver)
-         (display (list "saw head: " grob " coming from " source-engraver))
-         ))
-       ))
-      (cons 'end-acknowledgers
-       (list
-       (cons 'beam-interface
-        (lambda (engraver grob source-engraver)
-         (display (list "saw end of beam: " grob " coming from " 
source-engraver))
-         ))
-       ))
-      (cons 'process-music
-       (lambda (trans)
-       (display (list "process-music"
-                 (ly:context-current-moment
-                  (ly:translator-context trans)) "\n"))))
-      (cons 'process-acknowledged
-       (lambda (trans)
-       (display (list "process-acknowledged"
-                 (ly:context-current-moment
-                  (ly:translator-context trans)) "\n"))))
-      (cons 'stop-translation-timestep
-       (lambda (trans)
-       (display (list "stop-trans"
-                 (ly:context-current-moment
-                  (ly:translator-context trans)) "\n"))))
-      (cons 'finalize
-       (lambda (trans)
-       (display (list "finalize"
-                 (ly:context-current-moment
-                  (ly:translator-context trans)) "\n"))))
-    )
-
+    #`((initialize .
+       ,(lambda (trans)
+         (display (list "initialize"
+                   (ly:context-current-moment
+                    (ly:translator-context trans)) "\n"))))
+       (start-translation-timestep .
+       ,(lambda (trans)
+         (display (list "start-trans"
+                   (ly:context-current-moment
+                    (ly:translator-context trans)) "\n"))))
+       (listeners
+       (rest-event . ,(lambda (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 .
+        ,(lambda (engraver grob source-engraver)
+          (display (list "saw head: " grob " coming from " source-engraver))
+        )))
+       (end-acknowledgers
+       (beam-interface .
+        ,(lambda (engraver grob source-engraver)
+          (display (list "saw end of beam: " grob " coming from " 
source-engraver))
+        )))
+       (process-music .
+       ,(lambda (trans)
+         (display (list "process-music"
+                   (ly:context-current-moment
+                    (ly:translator-context trans)) "\n"))))
+       (process-acknowledged .
+       ,(lambda (trans)
+         (display (list "process-acknowledged"
+                   (ly:context-current-moment
+                    (ly:translator-context trans)) "\n"))))
+       (stop-translation-timestep .
+       ,(lambda (trans)
+         (display (list "stop-trans"
+                   (ly:context-current-moment
+                    (ly:translator-context trans)) "\n"))))
+       (finalize .
+       ,(lambda (trans)
+         (display (list "finalize"
+                   (ly:context-current-moment
+                    (ly:translator-context trans)) "\n")))))
                }}
 
 


-- 
David Kastrup





reply via email to

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