Syntax 理解常见的Lisp-do语法
我有一个小问题要理解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*) 我真的不明白我的身体在哪里,在我
(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
))