我在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)))放在变量定义中?
答案 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
))