This question already has answers here:
Closed 3 years ago.
Why does an elisp local variable keep its value in this case?
(3个答案)
我注意到,当我调用函数fillBoard时,它似乎可以按照我的要求填充传递给它的列表,但它有一个非常奇怪的副作用不知怎的,一旦调用fillboard,clearboard函数将只返回fillboard返回的列表。另外,如果我再次调用fillBoard,它将继续更新clearBoard中返回的值。
据我所知,每次调用list变量时,clear中都应该有一个新的list变量实例,所以我不知道它是如何被修改的,也不知道它是如何存储新值的。
我正在向fillBoard传递一个类似((0 0 0)(0 0 0 0)(0 0 0 0)(0 0 0 0 0))的空列表,它将返回类似((1 2 3 0)(0 6 0)(0 0 0)(0 0 0 0))的列表,这就是clearBoard返回的内容。
编辑:我确实通过将CelpBoad通过列表,然后将其直接设置为空白板而不是本地变量来缓解问题,然后返回。然而,我仍然很好奇在最初的一期中发生了什么
分配新列表
在
不修改文本数据
这里的文字数据是一个数据列表,嵌入在代码中不要修改代码。
(3个答案)
我注意到,当我调用函数fillBoard时,它似乎可以按照我的要求填充传递给它的列表,但它有一个非常奇怪的副作用不知怎的,一旦调用fillboard,clearboard函数将只返回fillboard返回的列表。另外,如果我再次调用fillBoard,它将继续更新clearBoard中返回的值。
据我所知,每次调用list变量时,clear中都应该有一个新的list变量实例,所以我不知道它是如何被修改的,也不知道它是如何存储新值的。
我正在向fillBoard传递一个类似((0 0 0)(0 0 0 0)(0 0 0 0)(0 0 0 0 0))的空列表,它将返回类似((1 2 3 0)(0 6 0)(0 0 0)(0 0 0 0))的列表,这就是clearBoard返回的内容。
(defun fillBoard (list)
(let ((numVals (+ 4 (random 3)))
(rand 0)
(val1 0)
(val2 0))
(dotimes (x numVals)
(setf val1 (random 3))
(setf val2 (random 3))
(setf rand (nth val1 (nth val2 soln)))
(prin1 rand)
(write-line " ")
(if (= (nth val1 (nth val2 list)) 0)
(setf (nth val1 (nth val2 list)) rand)))
list))
(defun clearboard ()
(let (( list '((0 0 0 0) (0 0 0 0) (0 0 0 0) (0 0 0 0))))
list))
编辑:我确实通过将CelpBoad通过列表,然后将其直接设置为空白板而不是本地变量来缓解问题,然后返回。然而,我仍然很好奇在最初的一期中发生了什么
最佳答案
退货结果的质量
函数始终返回相同的文本列表。它是嵌入到代码中的数据不要修改它。
CL-USER 4 > (eq (clearboard) (clearboard))
T
EQ
返回T
,因为两个列表中的第一个cons实际上是相同的cons。分配新列表
在
COPY-TREE
中使用clearboard
创建新分配的列表列表,而不是一遍又一遍地返回相同的文本列表:(defun clearboard ()
(copy-tree '((0 0 0 0)
(0 0 0 0)
(0 0 0 0)
(0 0 0 0))))
CL-USER 5 > (eq (clearboard) (clearboard))
NIL
不修改文本数据
这里的文字数据是一个数据列表,嵌入在代码中不要修改代码。
09-10 03:02