common-lisp - 实际上,REMOVE 会返回相同的序列吗?

标签 common-lisp

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

The result of remove may share with sequence; the result may be identical to the input sequence if no elements need to be removed.

例如,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"

最佳答案

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

例如 CLISP 返回原始字符串。

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

T

关于common-lisp - 实际上,REMOVE 会返回相同的序列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/721803/

相关文章:

lisp - 在 setf 中使用条件位置

loops - 可以cl :loop use a custom sum function?

lisp - 我对 LISP cons-cell 列表的定义是否正确?

lisp - 包的文件在哪里?

oop - 如何在方法上使用 funcall 来设置对象的属性

lisp - 如何在 lisp 中创建 (d . nil)

lisp - ' ('(LIST) ' 无 'NIL) should be a lambda expression in (hanoi(' ('(list)' ()'())))

file-io - 在 Common Lisp 中逐行(低内存)读取文件

common-lisp - 使用 SLIME 在 Aquamacs 中编译 SBCL defun 时出现类型错误

stream - 我是否必须关闭使用 make-string-input-stream 创建的流