parent $root object $dictionary method to_list arg dict; var list, x, k; // merges into an associated list. k = dict_keys(dict); list = []; for x in (k) list = [@list, [x, dict[x]]]; return list; . method union arg dict1, dict2; var key; // like union() but for dictionaries. adds any keys from dict2 that don't // already exist in dict1 to dict1 and returns the result. Order of keys in // result is not guaranteed. for key in (dict1) dict2 = dict_add(dict2, key[1], key[2]); return dict2; . method values arg dict; var list, x, k; // returns values same as dict_keys() returns keys. k = dict_keys(dict); list = []; for x in (k) list = [@list, dict[x]]; return list; . method replace arg dict, key, value; dict = (> dict_del(dict, key) <); dict = (> dict_add(dict, key, value) <); return dict; . method invert arg dict; var inverted, x; // Invert a dict (keys<->values) inverted = #[]; for x in (dict_keys(dict)) inverted = dict_add(inverted, dict[x], x); return inverted; . method add_elem arg dict, key, elem; var value; // same as old dict_add_elem value = (| dict[key] |); if (type(value) != 'list && type(value) != 'error) throw(~type, "Value for key " + $parse.unparse(key) + " (" + $parse.unparse(value) + ") is not a list."); if (value) value = [@value, elem]; else value = [elem]; return dict_add(dict, key, value); . method del_elem arg dict, key, elem; var value; value = (| dict[key] |); if (type(value) != 'list && type(value) != 'error) throw(~type, "Value for key " + $parse.unparse(key) + " (" + $parse.unparse(value) + ") is not a list."); value = setremove(value, elem); if (!value) return dict_del(dict, key); return dict_add(dict, key, value); . method add arg [args]; return (> dict_add(@args) <); . method del arg [args]; return (> dict_del(@args) <); . method keys arg [args]; return (> dict_keys(@args) <); . method contains arg [args]; return (> dict_contains(@args) <); .