LISP - 符号

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

符号的特殊之处在于它们有一个称为属性列表plist的组件。

属性列表

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

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

创建符号时,其属性列表最初为空。 属性是通过在 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)