2015-04-09 2 views
1

Я пытаюсь удалить строку из вектора таким образом:Удалить строку из вектора

CL-USER> (defparameter *x*(vector 1 "ab" 3)) 
*X*         
CL-USER> (remove "ab" *x*) 
#(1 "ab" 3)                        

Я хочу, чтобы получить #(1 3) в результате последней операции.

Может ли кто-нибудь объяснить мне, что происходит, как получить ожидаемый результат?

Я использую SBCL + Slime + Emacs + Ubuntu 14.04.

EDIT:

Я думаю, что я нашел ответ, потому, что функция сравнения по умолчанию EQL, в то время как сравнение строк должна выполняться со строкой = функции.

Одна проблема остается, потому что вы не можете использовать string = для чисел. Может быть, с новой функцией для сравнения каждой переменной в зависимости от ее типа можно решить.

ответ

4

Одна проблема остается, потому что вы не можете использовать string = для чисел. Может быть, с новой функцией для сравнения каждой переменной в зависимости от ее типа можно задать тип .

Во-первых, обратите внимание, что вы не сравниваю переменные, вы сравниваете значения. Оценки функции оцениваются до, вызываемая функция. Вы можете сделать (string = (aref some-strings 3) (make-string & hellip;)) и сравнить две строки, но ни (насколько нам известно) значение переменной. Я подчеркиваю это только потому, что вы не можете сравнить переменную на основе ее типа в Common Lisp, поскольку переменные не имеют типов; значения есть типы.

Во всяком случае, это было в стороне; Common Lisp включает функции, которые делают то, что вы ищете. Вы можете использовать equal или equalp, который спустится в строку, но не будет жаловаться на сравнение различных типов объектов:

CL-USER> (remove "ab" #(1 "ab" 3)) 
#(1 "ab" 3) 
CL-USER> (remove "ab" #(1 "ab" 3) :test 'equal) 
#(1 3) 
CL-USER> (remove "ab" #(1 "ab" 3) :test 'equalp) 
#(1 3) 

EQUALP сравнит случай нечувствительно:

CL-USER> (remove "aB" #(1 "ab" 3) :test 'equal) 
#(1 "ab" 3) 
CL-USER> (remove "aB" #(1 "ab" 3) :test 'equalp) 
#(1 3)