3

在 Common Lisp 的任何实际实现中,REMOVE是否会返回相同的序列?该规范表明它是允许的:

remove 的结果可能与序列共享;如果不需要删除任何元素,则结果可能与输入序列相同。

例如,SBCL 似乎没有这样做,但我只做了一个粗略的(可能不充分的)测试,我想知道其他实现是做什么的。

CL-USER> (defparameter *str* "bbb")
*STR*
CL-用户> *str*
“bb”
CL-USER> (defparameter *str2* (remove #\a *str*))
*STR2*
CL-USER> (eq *str* *str2*)
零
CL-用户> *str*
“bb”
CL-用户> *str2*
“bb”
4

2 回答 2

6

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

例如,CLISP 返回原始字符串。

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

T
于 2009-04-06T16:32:47.293 回答
1

我怀疑这主要取决于实施。总的来说,我怀疑这并不常见,因为典型的情况是在调用 REMOVE 时删除了某些内容,因此对未删除的情况进行空间优化会导致运行时损失,并且不一定会节省任何空间,因为您想为字符串和数组的返回值分配空间,并且需要随时构建一个列表或执行两次操作。

于 2009-04-06T15:05:05.820 回答