Lisp-symbols

提供:Dev Guides
移動先:案内検索

LISP-シンボル

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

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

プロパティリスト

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

プロパティリストは、偶数(おそらくゼロ)の要素を持つリストとして実装されます。 リスト内の要素の各ペアはエントリを構成します。最初の項目は*指標*で、2番目の項目は*値*です

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

たとえば、次のステートメントにより、プロパティのタイトル、作成者、発行者、およびそれぞれの値を(シンボル) '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* 関数は、指定されたインジケータの指定されたシンボルのプロパティリストを検索し、見つかった場合は対応する値を返します。それ以外の場合はデフォルトが返されます(デフォルト値が指定されていない場合は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)