Sources *sources_;
Duration default_duration_;
string output_basename_;
+ SCM local_environment_;
int fatal_error_;
int error_level_;
bool ignore_version_b_;
Lily_parser (Sources *sources);
- Lily_parser (Lily_parser const &);
+ Lily_parser (Lily_parser const &, SCM env = SCM_UNDEFINED);
DECLARE_SCHEME_CALLBACK (layout_description, ());
}
LY_DEFINE (ly_parser_clone, "ly:parser-clone",
- 1, 0, 0, (SCM parser_smob),
+ 1, 1, 0, (SCM parser_smob, SCM local_environment),
"Return a clone of @var{parser-smob}.")
{
LY_ASSERT_SMOB (Lily_parser, parser_smob, 1);
Lily_parser *parser = unsmob_lily_parser (parser_smob);
- Lily_parser *clone = new Lily_parser (*parser);
+ Lily_parser *clone = new Lily_parser (*parser, local_environment);
return clone->unprotect ();
}
sources_ = sources;
default_duration_ = Duration (2, 0);
error_level_ = 0;
+ local_environment_ = SCM_UNDEFINED;
smobify_self ();
lexer_->unprotect ();
}
-Lily_parser::Lily_parser (Lily_parser const &src)
+Lily_parser::Lily_parser (Lily_parser const &src, SCM env)
{
lexer_ = 0;
sources_ = src.sources_;
default_duration_ = src.default_duration_;
error_level_ = src.error_level_;
output_basename_ = src.output_basename_;
+ local_environment_ = env;
smobify_self ();
if (src.lexer_)
Lily_parser::mark_smob (SCM s)
{
Lily_parser *parser = (Lily_parser *) SCM_CELL_WORD_1 (s);
+ scm_gc_mark (parser->local_environment_);
return (parser->lexer_) ? parser->lexer_->self_scm () : SCM_EOL;
}
/* Read expression from port. */
if (!SCM_EOF_OBJECT_P (form))
{
- if (ps->safe_)
+ if (ps->parser_ && !SCM_UNBNDP (ps->parser_->local_environment_))
+ answer = scm_local_eval (form, ps->parser_->local_environment_);
+ else if (ps->safe_)
{
static SCM module = SCM_BOOL_F;
if (module == SCM_BOOL_F)