2014-11-10 2 views

ответ

4

Ответ

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.

+0

Большое вам спасибо :) еще что-то типа newb в этом, и мое мышление все еще слишком сильно связано с C & C++. –

+2

@MiguelNoronha: если на ваш вопрос был дан ответ, следует закрыть его, [принимая ответ] (http : //meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – sds

Смежные вопросы