困惑于"做" Racket代码中的变量

时间:2018-06-18 04:53:21

标签: variables scope racket do-loops

不明白为什么     "" 和     " 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)))

2 个答案:

答案 0 :(得分:1)

(do之后定义了do循环的局部变量:

  • (a 1 (+ a v1))含义:定义具有起始值a的本地循环变量1,并在新一轮开始时将(+ a v1)分配给a
  • (b 2 (+ b v2))含义:定义具有起始值b的本地循环变量2,并在新一轮开始时将(+ b v2)分配给b

因此,abdo循环中定义。

答案 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))))