Lisp - 符号



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

使符号特殊的是它们有一个称为属性列表plist的组件。

属性列表

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

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

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

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

示例

创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。

main.lisp

; create object books, assign symbol title a value
(write (setf (get 'books'title) '(Gone with the Wind)))
; terminate printing
(terpri)
; update object books, assign symbol author a value
(write (setf (get 'books 'author) '(Margaret Michel)))
; terminate printing
(terpri)
; update object books, assign symbol publisher a value
(write (setf (get 'books 'publisher) '(Warner Books)))

输出

执行代码时,它返回以下结果:

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

各种属性列表函数允许您分配属性以及检索、替换或删除符号的属性。

get 函数返回给定指示符的符号的属性列表。它具有以下语法:

get symbol indicator &optional default

get 函数查找给定符号的属性列表中指定的指示符,如果找到则返回相应的值;否则返回默认值(如果未指定默认值,则为 nil)。

示例

更新名为 main.lisp 的源代码文件,并在其中键入以下代码。

main.lisp

; create object books, assign symbol title a value
(setf (get 'books 'title) '(Gone with the Wind))
; create object books, assign symbol author a value
(setf (get 'books 'author) '(Margaret Micheal))
; create object books, assign symbol publisher a value
(setf (get 'books 'publisher) '(Warner Books))

; retrieve title from books object
(write (get 'books 'title))
; terminate printing
(terpri)
; retrieve author from books object
(write (get 'books 'author))
; terminate printing
(terpri)
; retrieve publisher from books object
(write (get 'books 'publisher))

输出

执行代码时,它返回以下结果:

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

symbol-plist 函数允许您查看符号的所有属性。

示例

创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。

main.lisp

; create object annie, assign symbols values
(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)
; terminate printing
(terpri)
; print symbol lists
(write (symbol-plist 'annie))

输出

执行代码时,它返回以下结果:

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)

remprop 函数从符号中删除指定的属性。

示例

更新名为 main.lisp 的源代码文件,并在其中键入以下代码。

main.lisp

; create object annie, assign symbols values
(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)
; terminate printing
(terpri)
; print symbol lists
(write (symbol-plist 'annie))
; removing properties age
(remprop 'annie 'age)
; terminate printing
(terpri)
; print symbol lists
(write (symbol-plist 'annie))

输出

执行代码时,它返回以下结果:

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