Scheme 在racket中实现for循环

Scheme 在racket中实现for循环,scheme,racket,Scheme,Racket,我一直在尝试使用for循环在递归函数中实现for循环。不允许在球拍内使用已实施的。有没有办法实施这样一个案例 注:我使用的是中级学生语言 下面是一个例子。函数squares生成前n个方号的列表。为了生成该列表,它使用索引i在数字0,…,n-1上循环 首先,在朗球拍是纯粹的副作用。通常,您希望其他变量(如for/map和for/fold)最终生成一个值 Racket是Scheme的后代,其中的所有循环只是应用递归函数的语法糖。例如,do循环: 在现实中,这种语言并不是一种原始语言。相反,该实现通常

我一直在尝试使用for循环在递归函数中实现for循环。不允许在球拍内使用已实施的。有没有办法实施这样一个案例


注:我使用的是中级学生语言

下面是一个例子。函数squares生成前n个方号的列表。为了生成该列表,它使用索引i在数字0,…,n-1上循环

首先,在朗球拍是纯粹的副作用。通常,您希望其他变量(如for/map和for/fold)最终生成一个值

Racket是Scheme的后代,其中的所有循环只是应用递归函数的语法糖。例如,do循环:

在现实中,这种语言并不是一种原始语言。相反,该实现通常有一个宏,将其转换为以下内容或类似内容:

(let loop ((vec (make-vector 5)) (i 0))
  (if (= i 5)
      vec
      (begin
        (vector-set! vec i i)
        (loop vec (+ i 1)))))
这当然只是糖:

((letrec ((loop (lambda (vec i)  
                    (if (= i 5)
                        vec
                        (begin
                          (vector-set! vec i i)
                          (loop vec (+ i 1)))))))
   loop)
 (make-vector 5) (i 0))

当然,letrec也是糖。。。这可以归结为在某种程度上使用lambda

当我使用这段代码时,我得到了一个数组:define:函数体应该只有一个表达式,但找到了一个额外的partDerik。如果您使用的是教学语言,则需要指定哪一个。将内部定义包装为local。查找如何使用本地。我也不允许使用本地。我问我的教授你可以用什么?
(let loop ((vec (make-vector 5)) (i 0))
  (if (= i 5)
      vec
      (begin
        (vector-set! vec i i)
        (loop vec (+ i 1)))))
((letrec ((loop (lambda (vec i)  
                    (if (= i 5)
                        vec
                        (begin
                          (vector-set! vec i i)
                          (loop vec (+ i 1)))))))
   loop)
 (make-vector 5) (i 0))