gpt4 book ai didi

lisp - 函数中的 setf 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:40 26 4
gpt4 key购买 nike

我在我的脚本中定义了一个特殊变量 *unsorted-lst* 和一个用于重置此变量的函数:

(defparameter *unsorted-lst* nil)

(defun reset-to-unsorted-list ()
(setf *unsorted-lst* '(1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44))
(format t "after reset: ~a~%" *unsorted-lst*)
)

之后我将它们复制到 SBCL 控制台进行测试,我做了:

* (setf *unsorted-lst* '(1 2 3))
(1 2 3)
* (reset-to-unsorted-list)
after reset: (1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
NIL

目前一切正常。然后我做了

* (setf (second *unsorted-lst*) 100)
100
* (reset-to-unsorted-list)
after reset: (1 100 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
NIL

函数里的setf好像不行,第二个元素的值还是100,真是迷惑了。我必须直接在控制台中键入 setf 命令才能进行更改:

* (setf *unsorted-lst* '(1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44))

(1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
* *unsorted-lst*
(1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)

现在可以了。我不知道这是什么错误?是不是对setf有什么误解?还是变量?

最佳答案

您需要将变量数据设置为一个新的新鲜列表,它是文字数据的副本。不要让全局变量指向函数的局部文字数据。

您看到的也是 Common Lisp 程序中的未定义行为。

您在函数中使用文字数据。稍后您通过更改列表的第二个元素来修改此文字数据。究竟发生了什么是未公开的。一些可能的结果:

  • 数据与其他一些变量共享,所有人都看到了变化。
  • 发生错误是因为文字数据可能在只读内存中
  • 数据已更改

许多实现只是改变文字数据。在这种情况下,函数的数据已更改。

如果您希望函数重置变量值并创建非文字数据,您需要先复制文字列表。

CL-USER 30 > (defparameter *unsorted-lst* nil)
*UNSORTED-LST*

CL-USER 31 > (defun reset-to-unsorted-list ()
(setf *unsorted-lst*
(copy-list '(1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)))
(format t "after reset: ~a~%" *unsorted-lst*))
RESET-TO-UNSORTED-LIST

CL-USER 32 > (setf *unsorted-lst* '(1 2 3))
(1 2 3)

CL-USER 33 > (reset-to-unsorted-list)
after reset: (1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
NIL

CL-USER 34 > (setf (second *unsorted-lst*) 100)
100

CL-USER 35 > (reset-to-unsorted-list)
after reset: (1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
NIL

关于lisp - 函数中的 setf 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20074462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com