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)