从向量中删除字符串
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)
我正在尝试通过这种方式从向量中删除字符串:
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)