高校数学の窓過去問検索

Scheme入門 第7章 かぁ&くだぁ

[図解が入る予定]


前の章に出てきた (78 80 100 95 66 72 98) というリストは、こんな構造をしてます。箱が2つ連なったのをペア(またはコンスセル)と言い、左側を car(カー)、右側を cdr(クダー)と呼びます。






それぞれペアの car に値が入って、cdr が次のペアを指しています。最後のペアは cdr に斜線が引かれていて、リストの終わりであることを表しています。手続き car と手続き cdr を使って、ペアから car だけ、または cdr だけを取り出すことが出来ます。





(define x '(78 80 100 95 66 72 98))
(display (car x))
(display (cdr x))





この場合 x というのは、上の図のようにリストの最初のペアを指してますから、その car は 78 ですね。78 と表示されましたか?cdr はリストの残りの部分を指しているので、(80 100 95 66 72 98) となります。さて、この cdr の、car は 80 のはずです。確かめてみましょう。





(define x '(78 80 100 95 66 72 98))
(display (car (cdr x)))





ちゃんと 80 が出ましたか?さて、リストの最後の斜線になっている部分には、何が入っているのでしょうか。どんどん cdr を辿っていってみます。





(define x '(78 80 100 95 66 72 98))
(display x)
(newline)
(display (cdr x))
(newline)
(display (cdr (cdr x)))
(newline)
(display (cdr (cdr (cdr x))))
(newline)
(display (cdr (cdr (cdr (cdr x)))))
(newline)
(display (cdr (cdr (cdr (cdr (cdr x))))))
(newline)
(display (cdr (cdr (cdr (cdr (cdr (cdr x)))))))
(newline)
(display (cdr (cdr (cdr (cdr (cdr (cdr (cdr x))))))))





実行すると、





(78 80 100 95 66 72 98)
(80 100 95 66 72 98)
(100 95 66 72 98)
(95 66 72 98)
(66 72 98)
(72 98)
(98)
()





何もなくなってしまいました。この () は「空リスト(からリスト)」と呼び、リストの終わりを表すものです。リスト最後の斜線の正体です。空リストから、さらに cdr を取り出そうとすると、エラーになりますので注意。




次は、リストに新しいペアをくっつけてみましょう。ペアを生成するには手続き cons を使います。(cons x y) のように使って、xy には car に入れる値と cdr に入れる値を指定します。実際にやってみましょう。お馴染みのリストの先頭に、cons で新しい値 99 を追加してみます。





(define x '(78 80 100 95 66 72 98))
(display (cons 99 x))





どうでしょう。
(99 78 80 100 95 66 72 98) と出るはずです。先頭に 99 が追加されていますね?これは cons によって、下図のように新しいペアがリストの先頭に追加されたからです。



[図解が入る予定]


さて次の実験は、cdr に他のペアや空リストじゃなく、ただの数値なんかを入れてみましょう。つまり次のようなリスト?を作ってみようというわけです。







(cons 10 20) -> (10 . 20)




どうやら出来たようですが、なにやら奇妙な表示が出てきました。これはドット対と呼ばれます(まぁ呼び方なんかどうでもいいです)。car に 10、cdr に 20 が入ったペアは、こういうふうに表記されます。cdr で取り出してみると、ちゃんと 20 が入ってることがわかります。





(cdr '(10 . 20)) -> 20




ペアは pair?、空リストは null? で判定できます。




第7章・完




第8章へ












DrScheme






  1. DrScheme での Language Pack の選択

  2. Scheme の単純な式「(+ 3 2)」, 「(- 10 4)」

  3. Scheme の単純な式(括弧の入れ子)

  4. Scheme の単純な式 (DrScheme の定義ウインドウ)

  5. 関数 area-of-disk の定義と,関数適用

  6. 関数 area-of-disk,変数 PI の定義と,関数適用(1)

  7. 関数 area-of-disk,変数 PI の定義と,関数適用(2)


0 コメント: