forループを使用してforループを再帰関数内で実装しようとしています。すでに実装されている "for"をラケットで使用することはできません。そのようなケースを実装する方法はありますか?ラウンドでforループを実装する
注:私は同じものの中学生言語を使用しています。
forループを使用してforループを再帰関数内で実装しようとしています。すでに実装されている "for"をラケットで使用することはできません。そのようなケースを実装する方法はありますか?ラウンドでforループを実装する
注:私は同じものの中学生言語を使用しています。
ここは例です。関数squares
は、最初のn
の正方形のリストを生成します。そのリストを生成するために、インデックスi
を使用して番号0、...、n-1にループします。 #lang racket
で
(define (squares n)
(define (loop i)
(if (= i n)
'()
(cons (* i i) (loop (+ i 1)))))
(loop 0))
(squares 10)
まずオフfor
は、副作用のために純粋です。通常、for/map
とfor/fold
のような他のバリアントが最終的に値を生成することを望みます。
RacketはSchemeの子孫であり、その中のすべてのループは、再帰関数が適用される文法的な砂糖です。例としてdo
ループ:現実に
(do ((vec (make-vector 5))
(i 0 (+ i 1)))
((= i 5) vec)
(vector-set! vec i i))
; ==> #(0 1 2 3 4)
は言語がプリミティブとして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:関数本体には1つの式しか期待されませんが、余分な部分が1つ見つかりました" – Deesha
Derik教える言語を使用している場合、どちらを指定する必要があります。 – soegaard
内部定義をローカルにラップします。ローカルの使い方を調べる。 – soegaard