プログラミング言語I

scheme

繰り返し

scheme では 繰り返しための、特別な 式 は あまり 重要ではありません。 特別な書式を使わなくても 評価のお約束に従って評価すれは、自然に繰り返すことができる式を書けるからです。

繰り返し

他のプログラミング言語では  for とか while とか repeat とか 特別な 形式を 覚えてその形式に合致するように、プログラムする必要があることが普通です。

繰り返し

scheme でも 繰り返しのための構文は用意されています。でも (私は)それが、ピタッとはまって 気持ち良いような 場面でないかぎりは使おうとは思いません。

do とかね

繰り返し

構文を覚えることが、プログラミングの本質ではないのです。 scheme では 構文も、自分で自由に作ることができます。なので必要だと思ったら、その場で、自分好みの構文を作るということが 行われます。でも、その場で作って、その時だけ使うので、それが世界標準になったりすることは、まずないです。

繰り返し

scheme では 自然に書けば良いのです

どのように動作しますか?

echo

(define echo (lambda () (print (read))))
手続き echo
引数 なし
手続きのボディ  (print (read))

実行例

echo

gosh> (echo)
1
1
#
gosh> 

実行例

echo

gosh> (echo)
ほげ
ほげ
#
gosh> 

どのように動作しますか?

echo

(define echo (lambda () 
  (print (read)) 
  (echo)))

実行例

echo

1
1
2
2
ほげ
ほげ
やっほー
やっほー

終わらない... (強制終了は ^C コントロールC)

echo

echo (やまびこあるいは鸚鵡返し)

(define echo (lambda () 
  (print (read)) 
  (echo)))
echo の定義の中で 定義中の echo をつかっている、 だって echo したいのだから. これは、いつまでも echo から抜けられない。ループしている
幸いにも (read) で 入力を待っているので、全力で、ループして、
計算しまくって、他の仕事ができなくなるようになる。ことにはならない.

ループを止めるには例えば

echo

(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 しつづけます

nが 10000 になったら 止まるように

(define up10000 (lambda (n) 
   (print n)
   (if (= n 10000) 'end (up10000 (+ n 1)) )))

手続の名前は up10000に変えています

ホゲ を 10000回実行したいなら

(define up10000 (lambda (n) 
   ホゲ
   (if (= n 10000) 'end (up10000 (+ n 1)) )))

echo を 定義しようとしている中で echo を呼び出す

up10000を 定義しようとしている中で up10000を呼び出す

再帰 : recursion