Variables 混淆为;“做”;球拍代码中的变量

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 (

不明白为什么 “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
  (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))))