🎾

Education: Racket: Racket におけるリストの使い方とデータ構造

2023/04/08に公開

はじめに

Racket は、LISP の方言である Scheme から派生した動的型付け言語です。LISP での主要なデータ構造であるリストは、Racket においても重要です。
この記事では、Racket におけるリストの構造と使用方法を詳しく勉強します。

Racket におけるリスト

リストは、Racket における要素の集まりです。'()のなかに各要素を空白で区切ってリストを作成します。
各要素には、数値、文字列などのさまざまなデータ型があります。

リストの例

Racket では、以下のように数値のリストを作成できます。なお、行頭の'はリストをそのまま出力するためにつけています。

'(1 2 3 4 5)

このリストには、1から5までの 5つの要素が含まれています。リストは、数値だけでなく、文字列や論理値などさまざまな型のデータを含むことができます。

以下は、数値、文字列、論理値を含むリストの例です。

'(1 "hello" #t)

このリストには、数値の1、文字列の"hello"、論理値の#tが含まれています。

リストの構造

リストは、コンスセルによる単方向リストで表現されます。コンスセルは car 部と cdr 部からなっており、car 部はリストの各要素、cdr 部は次のコンスセルへのポインタが入っています。リストの最後のセルは、cdr 部にエンドマークとして空のリスト'()が入っています。

たとえば、以下のリストをコンスセルを使って図解すると

'(1 2 3)

コンスセルによる図解
  +---+---+     +---+---+     +---+------+
  | 1 | o-+---->| 2 | o-+---->| 3 | '()  |
  +---+---+     +---+---+     +---+------+

リストの各要素には、リストそのものを含めることができます。コンスセルの car 部にリストへのポインタが入ります。
この場合のコードはつぎのようになります。

'(1 (2 3) 4)

コンスセルで図解すると

リストのデータ構造
+---+---+   +---+---+   +---+---+
| 1 | o-+-->| o | o-+-->| 4 | / |
+---+---+   +---+---+   +---+---+
              |
              v
            +---+---+---+
            | 2 | 3 | / |
            +---+---+---+

おわりに

この記事では、リストについて学習しました。
リストは、Racket において重要な概念の 1つであり、効果的なプログラミングのために欠かせない要素です。

参考資料

-The Racket Guide
-SICP

GitHubで編集を提案

Discussion