sbcl中nreverse的奇怪行为

adh*_*nay 2 clisp sbcl side-effects common-lisp

当我进入

(defvar lst '(1 2 3 4 5))
(nreverse lst)
lst
Run Code Online (Sandbox Code Playgroud)

在sbcl我得到了答案(1),而在clisp我得到了预期的答案(5 4 3 2 1).

有趣的是,第二行打印反转列表,但存储在lst中的值是错误的.这是一个功能还是一个bug?我应该只在sbcl上使用reverse吗?

Rai*_*wig 6

nreverse 可能作为副作用以未指定的方式改变原始列表.

您应该仅将该函数的结果用作反转列表.

从副作用中可以看出,SBCL和CLISP正在使用不同的实施策略.但你不应该利用这些知识.仅使用功能结果.nreverse如果效率很重要且可以销毁原始列表,则仅使用.