0

我有一个小问题要理解在 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 '() (缺点 xu)))

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

4

2 回答 2

6

您有表单的变量定义var init [step]

((x 0 (+1 x))
 (u '() (cons x u)))

this 在每次迭代中递增,并与列表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)))

这将给出相同的结果。

于 2013-12-12T22:23:27.003 回答
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

    ))
于 2013-12-13T04:43:42.620 回答