Domyślnie oznacza to, że dla obiektów jest używana równość.
Innymi słowy, assq
to eq
o smaku .
Struny nie są zgodne z równością eq
. Dwa ciągi, które są równoważnymi sekwencjami znaków, mogą nie być eq
. The assoc
w Emacs Lisp używa równości, która działa z ciągami.
Potrzebna jest tutaj assoc-delete-all
dla Twojej listy powiązań opartych na equal
, ale ta funkcja nie istnieje.
Wszystko mogę znaleźć podczas wyszukiwania assoc-delete-all
jest to lista dyskusyjna wątek: http://lists.gnu.org/archive/html/emacs-devel/2005-07/msg00169.html
Rolka własną rękę. To dość trywialne: maszerujesz w dół listy i zbierasz wszystkie wpisy na nową listę, której car
nie pasuje do podanego klucza pod numerem equal
.
Warto przyjrzeć się bibliotece kompatybilności z Common Lisp. http://www.gnu.org/software/emacs/manual/html_node/cl/index.html
Istnieje kilka przydatnych funkcji, takich jak remove*
, za pomocą których można usunąć z listy z niestandardową funkcją predykatu do testowania elementów. Z tym można zrobić coś takiego:
;; 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))
Wariant destrukcyjny jest delete*
.
Nawiasem mówiąc, musisz przypisać wynik zmiennej 'assq-delete-all' do zmiennej, nawet jeśli jest to operacja niszcząca:' (setq al (assq-delete-all 'a al)) '. Co się stanie, jeśli lista stanie się pusta? "Al" musi przyjąć wartość zero: jak to się stanie? A co jeśli usuniesz pierwszy element, główne minusy, na które początkowo wskazuje "al"?'al' musi zostać zaktualizowany, aby przejść do drugiej komórki. – Kaz