首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么sbcl通用语言的设置差异看起来是破坏性的?

为什么sbcl通用语言的设置差异看起来是破坏性的?
EN

Stack Overflow用户
提问于 2022-04-24 16:07:10
回答 1查看 56关注 0票数 0

下面的代码片段在SBCL2.2.3下编译(使用Emacs/SLIME,C),并且加载.fasl时没有错误。

在随后调用REPL中的测试集时,*evens*的值设置为*all*。阅读我可以找到的文档,我不知道为什么会发生这种情况,为什么调用测试集会导致零。提前感谢大家的阅读和/或回复。

代码语言:javascript
复制
(defun get-n (n) 
  "Return a list of integers from 0 up to n-1"
  (do ((i (1- n) (1- i)) 
       (res nil (cons i res))) 
      ((< i 0) res)))

(defun get-odd-n (n) 
  "Returns a list of odd integers from 1 up to n-1"
  (do ((i (1- n) (1- i)) 
       (res nil (if (oddp i) 
            (cons i res) res))) 
      ((< i 0) res)))

(defun get-even-n (n) 
  "Returns a list of even integers from 0 up to n-1"
  (do ((i (1- n) (1- i)) 
       (res nil (if (evenp i) 
            (cons i res) res))) 
      ((< i 0) res)))

(defconstant +n+ 10)
(defparameter *all* (get-n +n+))
(defparameter *odds* (get-odd-n +n+))
(defparameter *evens* (get-even-n +n+))

(defun test-sets () 
  "After compiling and loading .fasl, 
   why is *evens* altered after calling test-sets?"
  (and (equal (sort (intersection *evens* *all*) #'<) *evens*) 
       (equal (sort (intersection *odds* *all*) #'<) *odds*) 
       (equal (sort (union *odds* *evens*) #'<) *all*) 
       (equal (sort (set-difference *all* *odds* :test #'eql) #'<) *evens*) 
       (equal (sort (set-difference *all* *evens* :test #'eql) #'<) *odds*)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-24 16:53:49

UNION结果共享列表结构及其输入。

分类是破坏性的。

->

排序更改列表结构,包括。列表结构*evens*指向。

解决方案:

或者:定义一种非破坏性的排序。

或:或复制要排序的参数列表

代码语言:javascript
复制
(sort (copy-list ...) ...)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71990142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档