我有这个列表代码块。
(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)。任何人都可以解释这种行为吗?
答案 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.