class Scheme_engraver : public Engraver
{
-public:
void init_from_scheme (SCM definition);
- TRANSLATOR_DECLARATIONS_NO_LISTENER (Scheme_engraver);
+public:
+ TRANSLATOR_FAMILY_DECLARATIONS (Scheme_engraver);
+ Scheme_engraver (SCM definition);
protected:
~Scheme_engraver ();
// Alist of listened-symbol . scheme-function
SCM listeners_alist_;
- // We dont use this, but need it for the documentation boilerplate.
- static Protected_scm listener_list_;
SCM per_instance_listeners_;
};
#include "std-vector.hh"
#include "protected-scm.hh"
-#define TRANSLATOR_DECLARATIONS_NO_LISTENER(NAME) \
+#define TRANSLATOR_FAMILY_DECLARATIONS(NAME) \
public: \
- NAME (); \
VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \
- static SCM static_description_; \
static Drul_array<vector<Acknowledge_information> > acknowledge_static_array_drul_; \
- virtual void fetch_precomputable_methods (Callback methods[]); \
- virtual SCM static_translator_description () const; \
- virtual SCM translator_description () const; \
+ virtual void fetch_precomputable_methods (Callback methods[]); \
static Grob_info_callback static_get_acknowledger (SCM sym); \
static Grob_info_callback static_get_end_acknowledger(SCM); \
virtual Grob_info_callback get_acknowledger (SCM sym) \
virtual Grob_info_callback get_end_acknowledger (SCM sym) \
{ \
return static_get_end_acknowledger (sym); \
- } \
+ } \
/* end #define */
/*
*/
#define TRANSLATOR_DECLARATIONS(NAME) \
- TRANSLATOR_DECLARATIONS_NO_LISTENER(NAME) \
-private: \
+ TRANSLATOR_FAMILY_DECLARATIONS(NAME) \
+ static SCM static_description_; \
static Protected_scm listener_list_; \
public: \
+ NAME (); \
+ virtual SCM static_translator_description () const; \
+ virtual SCM translator_description () const; \
virtual SCM get_listener_list () const \
{ \
return listener_list_; \
return Translator::static_translator_description (grobs, desc, listener_list_, read, write); \
}
-#define ADD_TRANSLATOR(classname, desc, grobs, read, write) \
+#define ADD_TRANSLATOR_FAMILY(classname) \
IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname); \
+ DEFINE_ACKNOWLEDGERS(classname) \
+
+#define ADD_TRANSLATOR(classname, desc, grobs, read, write) \
+ ADD_TRANSLATOR_FAMILY (classname) \
ADD_THIS_TRANSLATOR (classname); \
DEFINE_TRANSLATOR_DOC(classname, desc, grobs, read, write) \
- DEFINE_ACKNOWLEDGERS(classname) \
- DEFINE_TRANSLATOR_LISTENER_LIST(classname) \
+ DEFINE_TRANSLATOR_LISTENER_LIST(classname) \
#define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T) \
void \
#include "translator.icc"
-Scheme_engraver::Scheme_engraver ()
+Scheme_engraver::Scheme_engraver (SCM definition)
{
stop_translation_timestep_function_ = SCM_EOL;
start_translation_timestep_function_ = SCM_EOL;
must_be_last_ = false;
per_instance_listeners_ = SCM_EOL;
+
+ init_from_scheme (definition);
}
Scheme_engraver::~Scheme_engraver ()
ADD_ACKNOWLEDGER (Scheme_engraver, grob);
ADD_END_ACKNOWLEDGER (Scheme_engraver, grob);
-ADD_TRANSLATOR (Scheme_engraver,
- /* doc */
- "Implement engravers in Scheme. Interprets arguments to"
- " @code{\\consists} as callbacks.",
-
- /* create */
- "",
-
- /* read */
- "",
-
- /* write */
- ""
- );
+ADD_TRANSLATOR_FAMILY (Scheme_engraver);
type = get_translator (definition);
else if (ly_is_pair (definition))
{
- type = get_translator (ly_symbol2scm ("Scheme_engraver"));
is_scheme = true;
}
else if (ly_is_procedure (definition))
// an argument and evaluates to an a-list scheme engraver
// definition.
definition = scm_call_1 (definition, cs);
- type = get_translator (ly_symbol2scm ("Scheme_engraver"));
is_scheme = true;
}
- if (!type)
+ if (!is_scheme && !type)
warning (_f ("cannot find: `%s'", ly_symbol2string (scm_car (s)).c_str ()));
else
{
- Translator *instance = type->clone ();
- if (is_scheme)
- dynamic_cast<Scheme_engraver *> (instance)->init_from_scheme (definition);
+ Translator *instance = is_scheme ? new Scheme_engraver (definition)
+ : type->clone ();
SCM str = instance->self_scm ();