scheme では 繰り返しための、特別な 式 は あまり 重要ではありません。 特別な書式を使わなくても 評価のお約束に従って評価すれは、自然に繰り返すことができる式を書けるからです。
他のプログラミング言語では for とか while とか repeat とか 特別な 形式を 覚えてその形式に合致するように、プログラムする必要があることが普通です。
scheme でも 繰り返しのための構文は用意されています。でも (私は)それが、ピタッとはまって 気持ち良いような 場面でないかぎりは使おうとは思いません。
do とかね
構文を覚えることが、プログラミングの本質ではないのです。 scheme では 構文も、自分で自由に作ることができます。なので必要だと思ったら、その場で、自分好みの構文を作るということが 行われます。でも、その場で作って、その時だけ使うので、それが世界標準になったりすることは、まずないです。
scheme では 自然に書けば良いのです
(define echo (lambda () (print (read))))
手続き echo
引数 なし
手続きのボディ (print (read))
gosh> (echo) 1 1 #gosh>
gosh> (echo) ほげ ほげ #gosh>
(define echo (lambda ()
(print (read))
(echo)))
1 1 2 2 ほげ ほげ やっほー やっほー終わらない... (強制終了は ^C コントロールC)
(define echo (lambda ()
(print (read))
(echo)))
echo の定義の中で 定義中の echo をつかっている、
だって echo したいのだから.
これは、いつまでも echo から抜けられない。ループしている
幸いにも (read) で 入力を待っているので、全力で、ループして、 計算しまくって、他の仕事ができなくなるようになる。ことにはならない.
(define echo (lambda ()
(define data (read))
(cond ((equal? data 'bye) 'good-bye)
(else (print data) (echo)))
))
(define sayone (lambda ()
(print 1)
(sayone)))
全力で1を print しつづけます
(define up (lambda (n)
(print n)
(up (+ n 1)) ))
全力で1,2,3,4,.....を print しつづけます
(define up10000 (lambda (n)
(print n)
(if (= n 10000) 'end (up10000 (+ n 1)) )))
(define up10000 (lambda (n)
ホゲ
(if (= n 10000) 'end (up10000 (+ n 1)) )))