LISP-シンボル

LISPでは、シンボルはデータオブジェクトを表す名前であり、興味深いことに、それはデータオブジェクトでもあります。

シンボルを特別なものにしているのは、シンボルと呼ばれるコンポーネントがあることです。 property list、または plist.

プロパティリスト

LISPを使用すると、シンボルにプロパティを割り当てることができます。たとえば、「person」オブジェクトがあるとします。この「person」オブジェクトには、名前、性別、身長、体重、住所、職業などのプロパティが必要です。プロパティは属性名のようなものです。

プロパティリストは、要素の数が偶数(場合によってはゼロ)のリストとして実装されます。リスト内の要素の各ペアはエントリを構成します。最初のアイテムはindicator, そして2番目は value.

シンボルが作成されると、そのプロパティリストは最初は空です。プロパティは、を使用して作成されますget 以内 setf 形。

たとえば、次のステートメントを使用すると、プロパティtitle、authorとpublisher、およびそれぞれの値を(symbol) 'book'という名前のオブジェクトに割り当てることができます。

例1

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します。

(write (setf (get 'books'title) '(Gone with the Wind)))
(terpri)
(write (setf (get 'books 'author) '(Margaret Michel)))
(terpri)
(write (setf (get 'books 'publisher) '(Warner Books)))

コードを実行すると、次の結果が返されます-

(GONE WITH THE WIND)
(MARGARET MICHEL)
(WARNER BOOKS)

さまざまなプロパティリスト関数を使用すると、プロパティを割り当てたり、シンボルのプロパティを取得、置換、または削除したりできます。

ザ・ get関数は、指定されたインジケーターのシンボルのプロパティリストを返します。次の構文があります-

get symbol indicator &optional default

ザ・ get関数は、指定されたインジケーターの指定されたシンボルのプロパティリストを検索し、見つかった場合は、対応する値を返します。それ以外の場合は、defaultが返されます(デフォルト値が指定されていない場合はnil)。

例2

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します。

(setf (get 'books 'title) '(Gone with the Wind))
(setf (get 'books 'author) '(Margaret Micheal))
(setf (get 'books 'publisher) '(Warner Books))

(write (get 'books 'title))
(terpri)
(write (get 'books 'author))
(terpri)
(write (get 'books 'publisher))

コードを実行すると、次の結果が返されます-

(GONE WITH THE WIND)
(MARGARET MICHEAL)
(WARNER BOOKS)

ザ・ symbol-plist 関数を使用すると、シンボルのすべてのプロパティを表示できます。

例3

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します。

(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)

(terpri)
(write (symbol-plist 'annie))

コードを実行すると、次の結果が返されます-

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)

ザ・ remprop 関数は、指定されたプロパティをシンボルから削除します。

例4

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します。

(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)

(terpri)
(write (symbol-plist 'annie))
(remprop 'annie 'age)
(terpri)
(write (symbol-plist 'annie))

コードを実行すると、次の結果が返されます-

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)
(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT)