为什么setq会削减我的列表

时间:2014-10-20 05:30:42

标签: lisp common-lisp

正如标题所说,我试图将项目附加到名为solution的列表中,下面是代码:

(defun add-solution (n)
    (let ((solution)) 
        (do((current-node '() (next-state current-node n nil)))
            ((equal current-node '(0 0 0 0)) solution)
            (if (goal-test current-node n)
                (progn
                    (format t "Cur: ~S~%" current-node)
                    (setq solution (append solution (list current-node)))
                    (format t "Solution: ~S~%" solution)
                )
            )   
        )
    )
)

每次新的当前节点都是:(1 7 8 14), (2 4 11 13),,但是当循环返回时returns ((1) (2)).. 我需要的是(((1 7 8 14) (2 4 11 13))。不确定那里发生了什么?

编辑: 我在setq之前和之后添加了格式函数,输出如下:


Cur: (1 7 8 14)
Solution: ((1 7 8 14))
Cur: (2 4 11 13)
Solution: ((1)(2 4 11 13))

在整个事情完成后,返回的值再次变为((1) (2))。我并没有真正做任何修改solution ...

的事情

1 个答案:

答案 0 :(得分:2)

看起来你的错误就在其他地方。

<强>样式:

我会像这样编写/格式化代码:

(defun add-solution (n)
  (do ((solution nil)
       (current-node '() (next-state current-node n nil)))
      ((equal current-node '(0 0 0 0)) solution)
    (when (goal-test current-node n)
      (setq solution (append solution (list current-node))))))

请注意,这是错误代码,因为您在循环中 APPENDING 项目到列表末尾。这可能是非常昂贵的操作。 Lisp列表经过优化,可以添加到前端,而不是最后。