Variables 混淆为;“做”;球拍代码中的变量
不明白为什么 “a” 及 “b” 在代码中工作?我们应该定义var吗 “a” 及 “b” 之前 “做” ? 在Variables 混淆为;“做”;球拍代码中的变量,variables,scope,racket,do-loops,Variables,Scope,Racket,Do Loops,不明白为什么 “a” 及 “b” 在代码中工作?我们应该定义var吗 “a” 及 “b” 之前 “做” ? 在(do之后,定义do循环的局部变量: (a1(+av1))含义:用起始值1定义局部循环变量a,并在新一轮开始时将(+av1)赋值给a (b2(+bv2))含义:用起始值2定义局部循环变量b,并在新一轮开始时将(+bv2)赋值给b 因此,a和b在do循环中定义。除了过程调用之外,没有控制流操作。 do只是一个宏。R5RS报告给出了一个实现: (define-syntax do (
(do
之后,定义do循环的局部变量:
含义:用起始值(a1(+av1))
定义局部循环变量1
,并在新一轮开始时将a
赋值给(+av1)
a
含义:用起始值(b2(+bv2))
定义局部循环变量2
,并在新一轮开始时将b
赋值给(+bv2)
b
因此,
a
和b
在do
循环中定义。除了过程调用之外,没有控制流操作。
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))))
欢迎!当您遇到以下语法问题时,我建议您始终咨询Hyperspec:)很好!racket doc没有太多类似的细节,但这是常见的lisp,我怎么知道它也适用于scheme或racket?这些示例在hyperspecnice中非常有用!那很有帮助!
(let loop ((a 1) (b 2))
(if (>= a b)
(if (= a b) 'YES 'NO)
(loop (+ a v1) (+ b v2))))