Racketでは、structを使用して構造化された値の形状を定義できます。例えば:
(struct person (name age))
構造を定義しperson
ます。これにより、次のような2フィールドの構造化された値を作成できます。
(define p1 (person "danny" 33))
(define p2 (person "richie" 31))
セレクター関数を使用して、構造化値の個々のフィールドにアクセスできます。
;; p: person -> void
(define (say-hi p)
(printf "hi, my name is ~a, and I am ~a years old\n"
(person-name p)
(person-age p)))
(say-hi p1)
(say-hi p2)
プレーンリスト構造を使用するなど、構造化された値を作成する方法は他にもあります。ただし、Racketのほとんどのアプリケーションでは、structを使用することをお勧めします。理由は次のとおりです。
構造体のフィールドへのアクセスは高速です-単一の間接参照。リスト表現では、フィールドアクセスにはリスト構造のウォークが含まれますが、これは多少コストがかかります。
構造体セレクターの型チェックにより、間違った種類のデータを渡す際の間違いをより迅速に検出し、適切なエラーメッセージを生成できます。
次に、二分探索木を作成するには、ツリーの個々のノードを表す構造を定義する必要があります。また、ノードは特殊な方法で順序付けられているため、構造を検索する際にシーケンシャルリストよりも高速になる可能性があるため、構築中はかなり厳格なルールに従う必要があります。
アルゴリズムの教科書は、ノード間の良好なバランスを保証するBSTを作成するために従うことができる潜在的なルールセットのいくつかを検討する必要があります。これらには、赤黒木などが含まれます。これには、挿入によって値がツリーにプッシュされるときに、ツリーの構造を維持する方法に固有のルールがあります。それがどのように発生するかについて、実際にはラケットは何もありません。バランスをうまく機能させるために従う必要があるのは、一般的な要件だけです。
Matt Mightは、Racketに実装された赤黒木に関する非常に優れた記事を書いています。