From 582bb6f37402960bb5d52aff9c7651ff6e8b1e29 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Sun, 9 Dec 2012 13:19:38 +0100 Subject: [PATCH] Issue 2981: Let \set ... = *undefined* unset values rather than overwriting. Also makes \once\set deal properly with a value that is not previously defined in the current context. --- lily/context.cc | 6 ++++++ lily/lily-guile.cc | 2 +- lily/property-iterator.cc | 13 ++++++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lily/context.cc b/lily/context.cc index 4d949e8379..90b41c155e 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -228,6 +228,12 @@ Context::set_property_from_event (SCM sev) if (scm_is_symbol (sym)) { SCM val = ev->get_property ("value"); + + if (SCM_UNBNDP (val)) { + unset_property (sym); + return; + } + bool ok = true; if (val != SCM_EOL) ok = type_check_assignment (sym, val, ly_symbol2scm ("translation-type?")); diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index e8380324fb..3fd0e890a0 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -62,7 +62,7 @@ ly_scm_write_string (SCM s) SCM ly_quote_scm (SCM s) { - return scm_list_n (ly_symbol2scm ("quote"), s, SCM_UNDEFINED); + return scm_list_2 (ly_symbol2scm ("quote"), s); } string diff --git a/lily/property-iterator.cc b/lily/property-iterator.cc index af1b38d159..6352f16399 100644 --- a/lily/property-iterator.cc +++ b/lily/property-iterator.cc @@ -35,14 +35,21 @@ Property_iterator::process (Moment mom) { Context *o = get_outlet (); Music *m = get_music (); - SCM previous_value = o->get_property (m->get_property ("symbol")); + bool once = to_boolean (m->get_property ("once")); + SCM symbol = m->get_property ("symbol"); + SCM previous_value = SCM_UNDEFINED; + if (once) { + Context *w = o->where_defined (symbol, &previous_value); + if (o != w) + previous_value = SCM_UNDEFINED; + } send_stream_event (o, "SetProperty", m->origin (), - ly_symbol2scm ("symbol"), m->get_property ("symbol"), + ly_symbol2scm ("symbol"), symbol, ly_symbol2scm ("value"), m->get_property ("value")); /* For \once \set install a finalization hook to reset the property to the * previous value after the timestep */ - if (to_boolean (m->get_property ("once"))) + if (once) { Global_context *tg = get_outlet ()->get_global_context (); tg->add_finalization (scm_list_n (once_finalization_proc, -- 2.39.2