Lisp DO变量语法推理

时间:2008-10-29 19:52:44

标签: syntax lisp let do-loops

在Peter Seibel的 Practical Common Lisp 中,他给出了这个例子:

(do ((nums nil) (i 1 (1+ i)))
    ((> i 10) (nreverse nums))
  (push i nums))

我可以看到它是如何工作的,在循环中使用nums但不给它一个步骤形式。为什么要将num放在变量定义中而不是这样做:

(let (nums) (do ((i 1 (+ i 1)))
         ((> i 10) (nreverse nums))
       (push i nums)))

我确信这是一个很好的理由,但我还没有得到它。

1 个答案:

答案 0 :(得分:12)

因为它很方便并且可以节省缩进。此外,累加器在概念上属于循环,为什么不把它放在那里?