common-lisp - sbcl 中 nreverse 的奇怪行为

标签 common-lisp sbcl clisp side-effects

当我进入

(defvar lst '(1 2 3 4 5))
(nreverse lst)
lst

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

有趣的是,第二行打印了颠倒的列表,但是 lst 中存储的值是错误的。这是功能还是错误?我应该在 sbcl 上只使用 reverse 吗?

最佳答案

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

你应该只使用函数的结果作为反向列表。

从副作用可以看出,SBCL和CLISP使用了不同的实现策略。但是你不应该利用这些知识。仅使用函数结果。仅在效率很重要并且可以销毁原始列表时使用nreverse

关于common-lisp - sbcl 中 nreverse 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33849213/

相关文章:

lisp - 在这种情况下我如何使用 "loop for"?

lisp - 第一个更大的(常见的)lisp 程序 -> 'random' 没有按预期工作

lisp - CLISP 中忽略了 DYNAMIC-EXTENT?

lisp - 获取列表中 elt 的 cdr

common-lisp - 包 RCL 和 Inf

lisp - 将包导入 SLIME REPL

lisp - asdf :load-system? 系统名是否必须与文件名一致

json - 为解析 JSON 字符串的递归调用获取正确的子序列

list - 在 lisp 函数中使用带有 cons 的嵌套汽车

macros - lisp 中的宏行为问题