LISP - 符號

在LISP語言中,符號是表示數據對象和有趣的是它也是一個數據對象的名稱。

是什麼使得符號特殊之處在於他們有分別叫property list,**或 **plist.

屬性列表

LISP可以讓屬性,以符號分配。例如,我們有一個'人'的對象。希望這個'人'的對象有像姓名,性別,身高,體重,住址,職業等屬性是一些屬性名稱。

一個屬性列表被實現爲具有元素爲偶數(可能爲零)的列表。每對列表中的元素構成一個條目;第一個項目是指標,而第二個是該值。

當創建一個符號,它的屬性列表最初是空的。屬性是使用於asetf形式得到建立。

例如,下面的語句使我們能夠分配屬性標題,作者和出版商,以及相應的值,命名(符號)'書'的對象。

示例 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)