For loop For循环如何在Scheme中工作?
我在理解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
(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,现在它对我来说更有意义了。