5 Drop symbol from the list alist..alist_end.
8 evict_from_alist (SCM symbol, SCM alist, SCM alist_end)
10 SCM new_alist = SCM_EOL;
11 SCM *tail = &new_alist;
13 while (alist != alist_end)
15 if (ly_is_equal (scm_caar (alist), symbol))
17 alist = scm_cdr (alist);
21 *tail = scm_cons (scm_car (alist), SCM_EOL);
22 tail = SCM_CDRLOC (*tail);
23 alist = scm_cdr (alist);
31 PROP_PATH should be big-to-small ordering
34 nested_property_alist (SCM alist, SCM prop_path, SCM value)
36 SCM new_value = SCM_BOOL_F;
37 if (scm_is_pair (scm_cdr (prop_path)))
39 SCM sub_alist = ly_assoc_get (scm_car (prop_path), alist, SCM_EOL);
40 new_value = nested_property_alist (sub_alist, scm_cdr (prop_path), value);
47 return scm_acons (scm_car (prop_path), new_value, alist);
51 Recursively purge alist of prop_path:
53 revert ((sym, val) : L, [sym]) = L
54 revert ((sym, val) : L, sym : props) =
55 (sym, revert (val, rest-props)) ++ L
56 revert ((sym, val) : L, p ++ rest-props) =
57 (sym, val) : revert (L, p ++ rest-props)
61 nested_property_revert_alist (SCM alist, SCM prop_path)
63 assert (scm_is_pair (prop_path));
65 SCM wanted_sym = scm_car (prop_path);
67 SCM new_list = SCM_EOL;
68 SCM *tail = &new_list;
69 for (SCM s = alist; scm_is_pair (s); s = scm_cdr (s))
71 SCM sub_sym = scm_caar (s);
72 SCM old_val = scm_cdar (s);
74 if (sub_sym == wanted_sym)
76 if (scm_is_pair (scm_cdr (prop_path)))
78 SCM new_val = nested_property_revert_alist (old_val, scm_cdr (prop_path));
80 /* nothing changed: drop newly constructed list. */
81 if (old_val == new_val)
84 *tail = scm_acons (sub_sym, new_val, SCM_EOL);
85 tail = SCM_CDRLOC (*tail);
89 /* old value is dropped. */
96 *tail = scm_acons (sub_sym, old_val, SCM_EOL);
97 tail = SCM_CDRLOC (*tail);
100 /* Wanted symbol not found: drop newly constructed list. */
105 set_nested_property (Grob *me, SCM big_to_small, SCM value)
107 SCM alist = me->get_property (scm_car (big_to_small));
109 alist = nested_property_alist (alist, scm_cdr (big_to_small), value);
111 me->set_property (scm_car (big_to_small), alist);