📜  LISP-符号

📅  最后修改于: 2020-11-03 07:15:49             🧑  作者: Mango


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

使符号与众不同的原因是它们具有一个称为属性列表plist的组件

物业清单

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

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

创建符号后,其属性列表最初为空。通过在setf表单中使用get创建属性。

例如,以下语句允许我们将属性title,author和Publisher和各自的值分配给名为(符号)“ 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)