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)
廣告