从向量中删除字符串

Remove string from a vector

我正在尝试通过这种方式从向量中删除字符串:

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.

编辑:

我想我找到了答案,因为默认的比较函数是 EQL,而字符串比较应该用 string= 函数来执行。

还有一个问题,因为您不能将 string= 用于数字。也许用一个新函数来比较每个变量取决于它的类型可以解决。

One problem remains, because you can not use string= for numbers. Maybe with a new function to compare each variable depending on it's type can be solved.

首先,请注意您不是在比较变量,而是在比较。在调用函数 之前 评估函数参数。您可以执行 (string= (aref some-strings 3) (make-string …)) 并比较两个字符串,但(据我们所知)都不是变量的值.我强调这一点只是因为你不能根据 Common Lisp 中的类型来比较 variable,因为变量没有类型; 有类型。

总之,那是题外话; Common Lisp 包含可以满足您的需求的函数。您可以使用 equal or 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)