我正在阅读实用的通用 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/