11

構造体についての私の理解では、構造体にはデータを格納するためのスロットがあり、型がmake-Xあり、スロットアクセサー関数があり、(型があるため) メソッドによって特殊化できるということです。

クラスについての私の理解は、それがすべて同じ多重継承を持っているということです。この質問に対する一番上の回答は、構造体は単一の継承を持つことができ、CLOS の初期実装は構造体よりも「はるかに遅い」と述べています。

人々が CLOS と構造体についてどのように話しているかに基づいて、他にもいくつかの違いがあるに違いないと思いますが、私の些細な Google 検索は役に立ちませんでした。だから私は尋ねます: CLOS と構造体の実際的な違いは何ですか?

4

2 に答える 2

23

構造物

構造はより原始的です。それらは、プログラミング言語でレコードと呼ばれることが多いものを提供します。それらは授業の前に発明されました。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 を使用している場合、通常は (追加の柔軟性のために) 良い兆候です。

于 2015-12-12T23:25:49.717 に答える
4

defstruct舞台裏でより多くの作業を行います。例:

  1. スロット アクセサーを自動的に定義する
  2. print-object読み取り可能なメソッドを定義します

また、構造体スロットへのアクセスが高速になりました (違いはおそらく重要ではありませんが)。

要するに、MOPish 機能が必要でない限り、defsrtuct.

于 2015-12-12T23:04:47.437 に答える