Reviewers: ,
Message:
Hi,
This is a proof-of-concept for instanciable scheme engravers, with
private instance slots.
There is at least one issue that I have to solve before this is
commitable, as this shows the following warning:
Warning : Attempting to remove nonexisting listener.
Warning : Attempting to remove nonexisting listener.
Description:
Instanciable scheme engraver
A scheme engraver definition may be a 0 argument procedure evaluating
to an a-list scheme engraver definition. This allows to define
instance slots for a scheme engraver.
Please review this at http://codereview.appspot.com/216066/show
Affected files:
A input/regression/scheme-engraver-instance.ly
M lily/translator-group.cc
Index: input/regression/scheme-engraver-instance.ly
diff --git a/input/regression/scheme-engraver-instance.ly
b/input/regression/scheme-engraver-instance.ly
new file mode 100644
index
0000000000000000000000000000000000000000..fd27654b8db2a388857c4627ca4b1d7eafd6020a
--- /dev/null
+++ b/input/regression/scheme-engraver-instance.ly
@@ -0,0 +1,32 @@
+\header {
+
+ texidoc = "Scheme engraver can define instance slots"
+
+}
+
+\version "2.13.14"
+
+\layout {
+ \context {
+ \Voice
+ \consists
+ #(let ((instance-counter 0))
+ (lambda ()
+ (set! instance-counter (1+ instance-counter))
+ (let ((instance-id instance-counter)
+ (private-note-counter 0))
+ `((listeners
+ (note-event
+ . ,(lambda (engraver event)
+ (set! private-note-counter (1+ private-note-counter))
+ (let ((text (ly:engraver-make-grob engraver 'TextScript
event)))
+ (ly:grob-set-property! text 'text
+ (format "~a.~a" instance-id
+
private-note-counter))))))))))
+ }
+}
+
+<<
+ \relative c'' { c4 d e f }
+ \\ \relative c' { c4 d e f }
+>>
\ No newline at end of file
Index: lily/translator-group.cc
diff --git a/lily/translator-group.cc b/lily/translator-group.cc
index
44b4e1fe0a1742dbb1e2fb34eeada2589004c2cd..cc835201f4120e47c1fa95012a81cf71f8507b75
100644
--- a/lily/translator-group.cc
+++ b/lily/translator-group.cc
@@ -167,6 +167,15 @@ Translator_group::create_child_translator (SCM sev)
instance = type->clone ();
dynamic_cast<Scheme_engraver*> (instance)->init_from_scheme
(definition);
}
+ else if (ly_is_procedure (definition))
+ {
+ // `definition' is a 0-arg procedure which should evaluate
+ // to an a-list scheme engraver definition
+ SCM def = scm_call_0 (definition);
+ type = get_translator (ly_symbol2scm ("Scheme_engraver"));
+ instance = type->clone ();
+ dynamic_cast<Scheme_engraver*> (instance)->init_from_scheme (def);
+ }
if (!type)
warning (_f ("cannot find: `%s'", ly_symbol2string (scm_car (s)).c_str
()));
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-devel