从向量中删除字符串

时间:2015-04-09 00:14:32

标签: common-lisp sbcl

我试图以这种方式从矢量中删除字符串:

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 = function来执行。

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

1 个答案:

答案 0 :(得分:4)

  

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

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

无论如何,这是暂时的; Common Lisp包含执行您正在寻找的功能。您可以使用equalequalp,它们会下降到字符串中,但不会抱怨比较不同类型的对象:

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)