Ответ
Pass :test #'equal
в member
:
(remove-if #'(lambda (var) (member var (list "x") :test #'equal)) (list "x" "y" "z"))
==> ("y" "z")
Обратите внимание, что
(eql "x" "x")
==> NIL
(equal "x" "x")
==> T
(eql 1 1)
==> T
Причина
по умолчанию One-Argument Test in Common Lisp is eql
.
Это самый разумный выбор между 4 общих функций сравнения назначения, предусмотренные стандартом ANSI CL (!):
eq
слишком зависит от реализации и не работает как один, вероятно, хочет на номера и символы
equal
и equalp
пересекают объекты и, таким образом, занимают много времени для огромных и никогда не могут заканчиваться для круговых.
См. Также the difference between eq
, eql
, equal
, and equalp
in Common Lisp.
Правильный путь
Использование set-difference
вместо remove-if
+ member
.
Большое вам спасибо :) еще что-то типа newb в этом, и мое мышление все еще слишком сильно связано с C & C++. –
@MiguelNoronha: если на ваш вопрос был дан ответ, следует закрыть его, [принимая ответ] (http : //meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – sds