当前位置: 首页 > 文档资料 > LISP 中文教程 >

Symbols

优质
小牛编辑
139浏览
2023-12-01

在LISP中,符号是表示数据对象的名称,有趣的是它也是数据对象。

使符号与众不同的是它们有一个称为property listplist.的组件plist.

物业清单

LISP允许您为符号指定属性。 例如,让我们有一个'人'对象。 我们希望这个“人”对象具有名称,性别,身高,体重,地址,职业等属性。属性就像属性名称。

属性列表实现为具有偶数(可能为零)元素的列表。 列表中的每对元素构成一个条目; 第一项是indicator,第二项是value.

创建符号时,其属性列表最初为空。 通过在setf形式中使用get来创建属性。

例如,以下语句允许我们将属性title,author和publisher以及相应的值分配给名为(symbol)'book'的对象。

例子1 (Example 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 (Example 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 (Example 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 (Example 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)