LISP做功能行为?

时间:2014-02-17 23:42:54

标签: lisp

我有这个列表代码块。

(defun test (y)
    (do 
        ((l NIL (setq y (rest y))))
        ((null y) 1)
        (setq l (append l '(1 1)))
        (print l)
    )
)

输出如下图所示。出于某种原因,它将l设置为y,然后附加'(1 1)。任何人都可以解释这种行为吗?

enter image description here

1 个答案:

答案 0 :(得分:3)

do循环的结构是:

(do ((var init-form step-form))
    (termination-form result-form)
  (body))

我认为您缺少的是每次迭代都会执行step-form,并且此表单的结果将设置为变量。因此,在setq中使用step-form是一个标志,您可能没有按照自己的意愿行事。

所以来自(test '(2 3 4))的循环序列是(删除打印)

 - Initialize l to nil
 - Check (null y) which is false since y = '(2 3 4).
 - (setq l (append l '(1 1))) l now has the value '(1 1)
 - Execute the step form, this sets y = '(3 4) _and_ l = '(3 4)
 - (null y) still false.
 -  (setq l (append l '(1 1))) sets l = '(3 4 1 1)
 - Execute step form, sets y = '(4) _and_ l = '(4)
 - (setq l (append l '(1 1))) sets l = '(4 1 1)
 - Execute step form, y = () so loop terminates.