我正在阅读实用的通用 Lisp。在 chapter 11, 中,它是关于排序的:



我尝试了以下代码:

CL-USER> (defparameter *a* #( 8 4 3 9 5 9 2 3 9 2 9 4 3))
*A*
CL-USER> *a*
#(8 4 3 9 5 9 2 3 9 2 9 4 3)
CL-USER> (sort *a* #'<)
#(2 2 3 3 3 4 4 5 8 9 9 9 9)
CL-USER> *a*
#(2 2 3 3 3 4 4 5 8 9 9 9 9)

在这段代码中,我们可以看到变量 *a* 已经被 sort 函数改变了。

那为什么书上说要做作业呢?

我正在使用 SBCL + Ubuntu 14.04 + Emacs + Slime

编辑:
在@Sylwester 的评论之后,我添加了 *a* 的评估,因此很明显该值已更改。

最佳答案

如果您希望您的变量之后包含排序序列的正确值,则有必要进行赋值。如果您不关心这一点并且只想要 sort 的返回值,则不需要赋值。

有两个原因。首先,允许实现使用非破坏性复制来实现破坏性操作。其次,列表上的破坏性操作可以置换 conses,使得传递给操作的值不再指向序列的第一个 cons。

这是第二个问题的示例(在 SBCL 下运行):

(let ((xs (list 4 3 2 1)))
  (sort xs '<)
  xs)
=> (4)

如果我们添加分配:
(let ((xs (list 4 3 2 1)))
  (setf xs (sort xs '<))
  xs)
=> (1 2 3 4)

关于common-lisp - lisp 中的破坏性排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29712654/

10-13 04:12