Node:Removing Alist Entries, Next:Sloppy Alist Functions, Previous:Retrieving Alist Entries, Up:Association Lists
To remove the element from an association list whose key matches a
specified key, use assq-remove!
, assv-remove!
or
assoc-remove!
(depending, as usual, on the level of equality
required between the key that you specify and the keys in the
association list).
As with assq-set!
and friends, the specified alist may or may not
be modified destructively, and the only safe way to update a variable
containing the alist is to set!
it to the value that
assq-remove!
and friends return.
address-list => (("bob" . "11 Newington Avenue") ("mary" . "34 Elm Road") ("james" . "1a London Road")) (set! address-list (assoc-remove! address-list "mary")) address-list => (("bob" . "11 Newington Avenue") ("james" . "1a London Road"))
Note that, when assq/v/oc-remove!
is used to modify an
association list that has been constructed only using the corresponding
assq/v/oc-set!
, there can be at most one matching entry in the
alist, so the question of multiple entries being removed in one go does
not arise. If assq/v/oc-remove!
is applied to an association
list that has been constructed using acons
, or an
assq/v/oc-set!
with a different level of equality, or any mixture
of these, it removes only the first matching entry from the alist, even
if the alist might contain further matching entries. For example:
(define address-list '()) (set! address-list (assq-set! address-list "mary" "11 Elm Street")) (set! address-list (assq-set! address-list "mary" "57 Pine Drive")) address-list => (("mary" . "57 Pine Drive") ("mary" . "11 Elm Street")) (set! address-list (assoc-remove! address-list "mary")) address-list => (("mary" . "11 Elm Street"))
In this example, the two instances of the string "mary" are not the same
when compared using eq?
, so the two assq-set!
calls add
two distinct entries to address-list
. When compared using
equal?
, both "mary"s in address-list
are the same as the
"mary" in the assoc-remove!
call, but assoc-remove!
stops
after removing the first matching entry that it finds, and so one of the
"mary" entries is left in place.
assq-remove! alist key | Scheme Procedure |
assv-remove! alist key | Scheme Procedure |
assoc-remove! alist key | Scheme Procedure |
scm_assq_remove_x (alist, key) | C Function |
scm_assv_remove_x (alist, key) | C Function |
scm_assoc_remove_x (alist, key) | C Function |
Delete the first entry in alist associated with key, and return the resulting alist. |