[Top][All Lists]
[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