我试图这样从向量中删除一个字符串:
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 =用于数字。也许可以通过一个新函数来比较每个变量的类型,具体取决于变量的类型。
仍然存在一个问题,因为您不能将string =用于数字。也许可以通过一个新函数来比较每个变量的类型,具体取决于变量的类型。
首先,请注意,您不是在比较变量,而是在比较值。在调用函数之前先评估函数参数。您可以执行(string =(aref some-strings 3)(make-string…))并比较两个字符串,但是(据我们所知)都不是变量的值。我强调这一点仅仅是因为您不能在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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句