【问题标题】:LISP function affecting other function [duplicate]LISP功能影响其他功能[重复]
【发布时间】: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


【解决方案1】:

返回结果的 EQness

您的函数始终返回相同的文字列表。它是嵌入到您的代码中的数据。不要修改它。

CL-USER 4 > (eq (clearboard) (clearboard))
T

EQ 返回T,因为两个列表中的第一个 cons 实际上是相同的 cons。

分配新的列表

clearboard 中使用COPY-TREE 创建一个新分配的列表列表,而不是一遍又一遍地返回相同的文字列表:

(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

不要修改文字数据

这里的文字数据是一个数据列表,它嵌入在您的代码中。不要修改你的代码。

【讨论】:

  • 知道了,感谢您指出这一点并给出详尽的解释!
【解决方案2】:

clearboard 返回的列表被定义为一个常量结构。当你在 fillBoard 中修改它时,你修改的不是副本,而是结构本身。用

代替生成板
(loop repeat 4 collect (make-list 4 :initial-element 0))

【讨论】:

  • 这还不够,因为内部列表只有一个副本。你需要像(loop repeat 4 collect (make-list 4 :initial-element 0)) 这样的东西(我想不出任何不使用loop 的东西,尽管必须有)。
  • 你是对的。星期一早些时候的编程很糟糕:(我复制了你的解决方案以避免让读者感到困惑。
猜你喜欢
  • 1970-01-01
  • 2018-01-26
  • 2020-11-18
  • 2014-09-15
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 2015-01-06
  • 2014-04-23
相关资源
最近更新 更多