Syntax 理解常见的Lisp-do语法

Syntax 理解常见的Lisp-do语法,syntax,lisp,common-lisp,do-loops,Syntax,Lisp,Common Lisp,Do Loops,我有一个小问题要理解lisp中的do 我有以下代码: (defun iota-b (n) (do ((x 0 (+1 x)) (u '() (cons x u))) ((> x n) (nreverse u)))) iota-b 5 01 2 3 4 5 在文档中有do基本模板: (do (variable-definitions*) (end-test-form result-form*) statement*) 我真的不明白我的身体在哪里,在我

我有一个小问题要理解lisp中的do

我有以下代码:

(defun iota-b (n)
  (do ((x 0 (+1 x))
      (u '() (cons x u)))
      ((> x n) (nreverse u))))
iota-b 5

01 2 3 4 5

在文档中有do基本模板:

(do (variable-definitions*)
    (end-test-form result-form*)
 statement*)
我真的不明白我的身体在哪里,在我的功能中 对我来说是

u'cons x u


显然不是,为什么我们把u'cons x u放在变量定义中

您有形式为var init[step]的变量定义

这会在每次迭代中增加x,并使用cons x u将u列表构建为5 4 3 2 1 0

结束测试

(> x n)
结果表

(nreverse u)
将列表5 4 3 2 1 0反转为给定结果

然后你有一个空的身体

当然,您可以将do循环修改为

(do ((x 0 (+1 x))
     (u '()))
    ((> x n) (nreverse u))
  (setq u (cons x u)))

这将给出相同的结果。

@Martialp您问题中的代码没有正确缩进。你知道在任何一个好的编辑器中修复缩进点击标签后会发生什么吗?是的,我看到了!嗯,谢谢,我想我明白了,谢谢!正确的缩进暗示了问题的存在。我建议不要编辑这篇文章,因为原始的缩进清楚地表明了问题可能来自何处。与向魔鬼屈服并循环x到3收集x相比,与括号搏斗是否更容易理解?
(defun iota-b (n)
  (do 
      ; var init step
      ((x   0    (1+ x))       ; var 1
       (u   '()  (cons x u)))  ; var 2

      ;test    result
      ((> x n) (nreverse u))   ; end ?

    ; body comes here
    ; this DO loop example has no body code
    ; the body code is optional

    ))
(defun iota-b (n)
  (do 
      ; var init step
      ((x   0    (1+ x))       ; var 1
       (u   '()  (cons x u)))  ; var 2

      ;test    result
      ((> x n) (nreverse u))   ; end ?

    ; body comes here
    ; this DO loop example has no body code
    ; the body code is optional

    ))