不明白为什么 "" 和 " B" 在代码中工作?我们应该定义var "" 和 " B" 之前 "做" ?
(define v1 3)
(define v2 2)
(do ((a 1 (+ a v1))
(b 2 (+ b v2)))
((>= a b) (if (= a b) 'YES 'NO)))
答案 0 :(得分:1)
在(do
之后定义了do循环的局部变量:
(a 1 (+ a v1))
含义:定义具有起始值a
的本地循环变量1
,并在新一轮开始时将(+ a v1)
分配给a
(b 2 (+ b v2))
含义:定义具有起始值b
的本地循环变量2
,并在新一轮开始时将(+ b v2)
分配给b
因此,a
和b
在do
循环中定义。
答案 1 :(得分:0)
除了过程调用之外,没有控制流操作。
do
只是一个宏。 R5RS报告给出了一个实现:
(define-syntax do
(syntax-rules ()
((do ((var init step ...) ...)
(test expr ...)
command ...)
(letrec
((loop
(lambda (var ...)
(if test
(begin
(if #f #f)
expr ...)
(begin
command
...
(loop (do "step" var step ...)
...))))))
(loop init ...)))
((do "step" x)
x)
((do "step" x y)
y)))
你的代码变成了这样的东西:
(let loop ((a 1) (b 2))
(if (>= a b)
(if (= a b) 'YES 'NO)
(loop (+ a v1) (+ b v2))))