Common lisp 实际上,REMOVE是否返回相同的序列?

Common lisp 实际上,REMOVE是否返回相同的序列?,common-lisp,Common Lisp,在公共Lisp的任何实际实现中是否返回相同的序列?规范建议允许: 移除的结果可与共享 序列结果可能是相同的 如果没有元素,则返回到输入序列 需要删除 例如,SBCL似乎并没有做到这一点,但我只做了一个粗略(可能不够)的测试,我想知道其他实现会做什么 CL-USER> (defparameter *str* "bbb") *STR* CL-USER> *str* "bbb" CL-USER> (defparameter *str2* (remove #\a *str*)) *STR2* CL-US

在公共Lisp的任何实际实现中是否返回相同的序列?规范建议允许:

移除的结果可与共享 序列结果可能是相同的 如果没有元素,则返回到输入序列 需要删除

例如,SBCL似乎并没有做到这一点,但我只做了一个粗略(可能不够)的测试,我想知道其他实现会做什么

CL-USER> (defparameter *str* "bbb") *STR* CL-USER> *str* "bbb" CL-USER> (defparameter *str2* (remove #\a *str*)) *STR2* CL-USER> (eq *str* *str2*) NIL CL-USER> *str* "bbb" CL-USER> *str2* "bbb" CL-USER>(定义参数*str*“bbb”) *STR* CL-USER>*str* “bbb” CL-USER>(defparameter*str2*(删除#\a*str*)) *STR2* CL-USER>(等式*str**str2*) 无 CL-USER>*str* “bbb” CL-USER>*str2* “bbb”
我怀疑这主要取决于实施情况。总的来说,我认为这并不常见,因为典型的情况是调用REMOVE时会删除某些内容,因此对未删除的情况进行空间优化会导致运行时惩罚,不一定会节省任何空间,因为您希望为字符串和数组的返回值分配空间,并且需要在运行时构造一个列表或执行两次传递操作。

返回原始字符串可能会很有用。如果字符串中没有任何元素被删除,返回原始序列将阻止分配新序列。即使在内部分配了一个新序列,这个新序列也可以尽快变成垃圾

例如,CLISP返回原始字符串

[1]> (let ((a "abc")) (eq a (remove #\d a)))

T