For loop For循环如何在Scheme中工作?

For loop For循环如何在Scheme中工作?,for-loop,scheme,racket,For Loop,Scheme,Racket,我在理解for循环如何在scheme中工作时遇到了一些困难。特别是这段代码可以运行,但我不知道为什么 (define (bubblesort alist) ;; this is straightforward (define (swap-pass alist) (if (eq? (length alist) 1) alist (let ((fst (car alist)) (scnd (cadr alist)) (rest (cddr alist

我在理解for循环如何在scheme中工作时遇到了一些困难。特别是这段代码可以运行,但我不知道为什么

 (define (bubblesort alist)
  ;; this is straightforward
  (define (swap-pass alist)
    (if (eq? (length alist) 1)
        alist
        (let ((fst (car alist)) (scnd (cadr alist)) (rest (cddr alist)))
          (if (> fst scnd)
              (cons scnd (swap-pass (cons fst rest)))
              (cons fst (swap-pass (cons scnd rest)))))))
  ; this is mysterious--what does the 'for' in the next line do?
  (let for ((times (length alist))
            (val alist))
    (if (> times 1)
        (for (- times 1) (swap-pass val))
        (swap-pass val))))
我不知道
(let for)(
在这里应该做什么,倒数第二行中的
for
表达式也有点令人不快——我让解释器抱怨
for
只需要一个参数,但在这里似乎需要两个参数


有什么想法吗?

这不是for循环,这是一个名为
let
的循环。它所做的是创建一个名为
for
的函数,然后调用它;循环行为是由函数中的递归引起的。顺便说一句,调用函数
loop
更惯用

(let loop ((times 10))
   (if (= times 0)
     (display "stopped")
     (begin (display "still looping...")
            (loop (- times 1)))))
扩展到类似于

(letrec ((loop (lambda (times)
                 (if (= times 0)
                   (display "stopped")
                   (begin (display "still looping...")
                          (loop (- times 1)))))))
  (loop 10))

这实际上并不是使用
for
语言功能,而是使用了
let
的一个变体,允许您轻松编写递归函数。请参阅
let
文档(这是第二种形式)

现在的情况是,这个
let
表单将它传递的名称(在本例中为
for
)绑定到一个具有给定参数列表(
times
val
)的过程,并用初始值调用它。在主体中使用绑定名称是递归调用


一句话:的
在这里并不重要。它只是一个名字。你可以将它重命名为
foo
,它仍然可以工作。Racket确实有实际的for循环,你可以阅读。

非常感谢,我按照你的描述扩展了命名let,现在它对我来说更有意义了。