+ SCM partials = SCM_EOL;
+ // partials is list of partial overrides for the given property
+ for (SCM p = nalist; scm_is_pair (p); p = scm_cdr (p))
+ {
+ SCM elt = scm_car (p);
+ SCM pkey = scm_car (elt);
+ if (scm_is_pair (pkey))
+ {
+ if (scm_is_eq (scm_car (pkey), key))
+ partials = scm_cons (elt, partials);
+ }
+ else if (scm_is_eq (pkey, key))
+ {
+ SCM value = scm_cdr (elt);
+ for (; scm_is_pair (partials); partials = scm_cdr (partials))
+ {
+ value = nested_property_alist (value, scm_cdaar (partials),
+ scm_cdar (partials));
+ }
+ return value;
+ }
+ }
+ if (scm_is_pair (partials))
+ {
+ // Bit of a quandary here: we have only subproperty overrides
+ // but no main property. Could be a programming error, but we
+ // instead override an empty list.
+ SCM value = nested_create_alist (scm_cdaar (partials), scm_cdar (partials));
+ partials = scm_cdr (partials);
+ for (; scm_is_pair (partials); partials = scm_cdr (partials))
+ value = nested_property_alist (value, scm_cdaar (partials),
+ scm_cdar (partials));
+ return value;
+ }
+ return SCM_UNBNDP (fallback) ? SCM_EOL : fallback;
+}