理解Common Lisp做语法

时间:2013-12-12 22:14:17

标签: syntax lisp common-lisp do-loops

我在lisp中有一点问题需要理解

我有这段代码:

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

(iota-b 5)

     

(0 1 2 3 4 5)

在文档中,“do”基本模板是:

(do (variable-definitions*)
    (end-test-form result-form*)
 statement*)

我真的不明白我的身体在我的身体iota-b中 对我来说是

  

(u'()(cons x u)))

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

2 个答案:

答案 0 :(得分:6)

您拥有var init [step]

形式的变量定义
((x 0 (+1 x))
 (u '() (cons x u)))

这会在每次迭代中递增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)))

这将得到相同的结果。

答案 1 :(得分:3)

(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

    ))