在实践中,REMOVE是否会返回相同的序列?

时间:2009-04-06 14:47:54

标签: common-lisp

REMOVE是否会在Common 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"

2 个答案:

答案 0 :(得分:6)

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

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

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

T

答案 1 :(得分:1)

我怀疑它主要取决于实施。总的来说,我怀疑它并不常见,因为典型的情况是在调用REMOVE时会删除某些内容,因此对没有删除的情况进行空间优化会导致运行时间的惩罚而不一定会节省任何空间,因为你想为字符串和数组的返回值分配空间,并且需要在你去的时候构建一个列表或者进行两遍操作。