Scheme 球拍/方案中惯用的嵌套循环

Scheme 球拍/方案中惯用的嵌套循环,scheme,range,racket,nested-loops,Scheme,Range,Racket,Nested Loops,有人知道在Racket/Scheme中,在一个范围内嵌套循环数字的惯用方法是什么吗?在Python中,我们有: for i in range(numb1): for j in range(numb2): 在Racket/Scheme中的等价物是什么?在Racket中,它就这么简单,使用: 还有另一种选择:使用显式递归并命名为: (让loop1((i0)) (cond(

有人知道在Racket/Scheme中,在一个范围内嵌套循环数字的惯用方法是什么吗?在Python中,我们有:

for i in range(numb1):
    for j in range(numb2):

在Racket/Scheme中的等价物是什么?

在Racket中,它就这么简单,使用:

还有另一种选择:使用显式递归并命名为:

(让loop1((i0))
(cond(
最后,您始终可以执行以下操作,有关详细信息,请参阅“嵌套映射”一节下的内容:

(define (range start stop)
  (let loop ((i (- stop 1))
             (acc '()))
    (if (< i start)
        acc
        (loop (- i 1) (cons i acc)))))

(for-each
 (lambda (i)
   (for-each
    (lambda (j)
      <body of iteration>)
    (range 0 numb2)))
 (range 0 numb1))
(定义(范围开始-停止)
(let循环((i(-stop 1))
(acc’())
(如果(
作为一个小P.S.对斯卡尔极好的回答:在球拍中,最好是功能性的。因此,您可能会发现自己使用了
for
的变体来返回一个值,例如
for/list
for/vector
,等等。这些是基于/fold的
构建的,这是最常见的“迭代和累积”形式。当然,当你需要做一些仅仅是为了效果的事情(比如I/O)时,你可能会使用普通的
作为
;再加上这是最简单的理解,所以奥斯卡用它作为例子是很好的。
(do ((i 0 (+ i 1))) ((= i numb1))
  (do ((j 0 (+ j 1))) ((= j numb2))
    <body of iteration>))
(let loop1 ((i 0))
  (cond ((< i numb1)
         (let loop2 ((j 0))
           (cond ((< j numb2)
                  <body of iteration>
                  (loop2 (+ j 1)))))
         (loop1 (+ i 1)))))
(define (range start stop)
  (let loop ((i (- stop 1))
             (acc '()))
    (if (< i start)
        acc
        (loop (- i 1) (cons i acc)))))

(for-each
 (lambda (i)
   (for-each
    (lambda (j)
      <body of iteration>)
    (range 0 numb2)))
 (range 0 numb1))