【发布时间】:2017-03-13 03:18:16
【问题描述】:
我注意到,当我调用函数 fillBoard 时,它似乎可以按我的意愿填充传递给它的列表,但它有一个非常奇怪的副作用。不知何故,一旦调用了 fillBoard,clearBoard 函数将只返回由 fillBoard 返回的列表。此外,如果我再次调用 fillBoard,它将继续更新 clearBoard 中返回的值。
据我了解,每次调用时都应该有一个明确的列表变量的新实例,所以我看不到它是如何被修改的或它是如何存储新值的。
我正在向 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 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))
编辑:我似乎通过将 clearBoard 传递给一个列表然后将其直接设置到空白板而不是局部变量,然后返回它来缓解这个问题。但是,我仍然对原始问题中发生的情况感到好奇
【问题讨论】:
-
clearboard返回不应修改的不可变数据。 -
旁注:将这样的板表示为二维数组通常更有用。
-
这会更容易实现,但我需要使用列表
标签: lisp common-lisp literals