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.
Delete the first entry in alist associated with key, and return the resulting alist.