構造物
構造はより原始的です。それらは、プログラミング言語でレコードと呼ばれることが多いものを提供します。それらは授業の前に発明されました。1984 年の CLtL1 (Common Lisp を記述した最初の本) にはすでに構造があり、後に CLOS と呼ばれる標準オブジェクト システムが追加されました。構造が提供する
- 簡潔な定義マクロ
DEFSTRUCT
- 単一継承
- 高速スロットアクセス
- スロットのリーダーと setf アクセスを定義します
- 型述語を定義する
- コンストラクタ関数を定義します
- コピー関数を定義します
- 印刷された表現: 構造を読み取って印刷することができます
- 上記の関数はインライン化されている可能性があります
便利な追加:
- DEFSTRUCT は、構造体の型に加えて、構造体のリストベースおよびベクターベースの表現を定義できます
制限:
- 構造タイプへの変更後、構造インスタンスは更新されません
- 構造型が変更された場合は、変更されたコードを再コンパイルして再実行することをお勧めします。たぶん、プログラムを再起動します。構造体を再定義した場合の影響は、標準の Common Lisp では定義されていません。
- 内省がほとんどない: 移植可能な Common Lisp は、構造のスーパー/サブ構造を簡単な方法で教えてくれません。移植可能な Common Lisp は、構造体のスロットを教えてくれません。
- デフォルトでは、スロット名によるスロット アクセスはありません
拡張機能
- 一部の実装では、より多くのランタイム イントロスペクションが提供され、一部の CLOS 関数が少し統合されています。
CLOSクラス
CLOSは、2 つの以前のオブジェクト システム (フレーバーとループ) に基づいて、80 年代半ば/後半に発明されました。以下を提供します。
- 定義マクロ
DEFCLASS
- 多重継承
- 作成、初期化などのプロトコル
- CLOS オブジェクトは、クラスの変更 (新しいスロット、再定義されたスロット、削除されたスロット、変更された継承など) に基づいて実行時に変更および更新できます。
- CLOS オブジェクトはクラスを変更し、実行時に更新できます
- スロット名によるアクセスが可能
制限:
- デフォルトのプリンター/リーダーなし
DEFCLASS
定義はあまり簡潔ではありません
拡張子
- 実装固有の機能の追加によるスロット アクセスの高速化
- メタオブジェクト プロトコルは、イントロスペクションとリフレクションという追加の機能と柔軟性を提供します。MOP の一部のみが提供される場合もあります。
- 特に MOP をサポートする実装では、ユーザー提供の拡張機能を利用できます。
Common Lisp
場合によっては、Common Lisp 標準が、機能をどのように実装すべきかを述べていません: 構造体、クラス、またはその他のものですらあります。例としては、ストリームと条件があります。Common Lisp の実装がそれらに CLOS を使用している場合、通常は (追加の柔軟性のために) 良い兆候です。