lilypond-devel
[Top][All Lists]
Advanced

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

Instanciable scheme engraver (issue216066)


From: nicolas . sceaux
Subject: Instanciable scheme engraver (issue216066)
Date: Sun, 21 Feb 2010 10:10:28 +0000

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 ()));






reply via email to

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