4

範囲内の数値でネストされたループの慣用的な方法が Racket/Scheme にあることを知っている人はいますか? Python には次のものがあります。

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

ラケット/スキームで同等のものは何ですか?

4

1 に答える 1

12

Racket では、Iterations と Comprehensionsを使用して、次のように単純です。

(for* ([i (in-range numb1)]
       [j (in-range numb2)])
  <body of iteration>)

上記はラケットでのみ機能します。比較すると、次のスニペットは、たとえば、ネストされた のペアを使用して、標準の RxRS インタープリターで機能しますdo

(do ((i 0 (+ i 1))) ((= i numb1))
  (do ((j 0 (+ j 1))) ((= j numb2))
    <body of iteration>))

さらに別のオプション: 明示的な再帰と名前付きを使用するlet:

(let loop1 ((i 0))
  (cond ((< i numb1)
         (let loop2 ((j 0))
           (cond ((< j numb2)
                  <body of iteration>
                  (loop2 (+ j 1)))))
         (loop1 (+ i 1)))))

最後に、いつでも次のようなことを行うことができます。詳細については、「ネストされたマッピング」セクションのSICPを参照してください。

(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))
于 2013-05-18T20:16:12.007 に答える