/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>,
+ Copyright (C) 1997--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>,
Erik Sandberg <mandolaerik@gmail.com>
LilyPond is free software: you can redistribute it and/or modify
for (SCM s = trans_names; scm_is_pair (s); s = scm_cdr (s))
{
SCM definition = scm_car (s);
+ bool is_scheme = false;
Translator *type = 0;
- Translator *instance = type;
if (ly_is_symbol (definition))
+ type = get_translator (definition);
+ else if (ly_is_pair (definition))
{
- type = get_translator (definition);
- instance = type->clone ();
+ type = get_translator (ly_symbol2scm ("Scheme_engraver"));
+ is_scheme = true;
}
- else if (ly_is_pair (definition))
+ else if (ly_is_procedure (definition))
{
+ // `definition' is a procedure, which takes the context as
+ // an argument and evaluates to an a-list scheme engraver
+ // definition.
+ definition = scm_call_1 (definition, cs);
type = get_translator (ly_symbol2scm ("Scheme_engraver"));
- instance = type->clone ();
- dynamic_cast<Scheme_engraver*> (instance)->init_from_scheme (definition);
+ is_scheme = true;
}
if (!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);
+
SCM str = instance->self_scm ();
if (instance->must_be_last ())