q
в assq
традиционно означает eq
равенство, используемое для объектов.
Другими словами, assq
- это eq
ароматизированный assoc
.
Строки не соответствуют eq
равенству. Две строки, которые являются эквивалентными последовательностями символов, не могут быть eq
. assoc
в Emacs Lisp использует equal
равенство, которое работает со строками.
Итак, вам нужен assoc-delete-all
для вашего equal
списка ассоциаций, но эта функция не существует.
Все, что я могу найти при поиске assoc-delete-all
, это ветка списка рассылки:
http://lists.gnu.org/archive/html/emacs-devel/2005-07/msg00169.html
Бросай свои. Это довольно тривиально: вы переходите по списку и собираете все эти записи в новый список, чей car
не соответствует заданному ключу в equal
.
Одной полезной вещью, на которую стоит обратить внимание, может быть библиотека совместимости Common Lisp. http://www.gnu.org/software/emacs/manual/html_node/cl/index.html
Там есть несколько полезных функций, таких как remove*
, с помощью которых вы можете удалить из списка пользовательскую функцию предиката для тестирования элементов. С этим вы можете сделать что-то вроде этого:
;; remove "a" from al, using equal as the test, applied to the car of each element
(setq al (remove* "a" al :test 'equal :key 'car))
Деструктивный вариант delete*
.