在程式設計語言的通用術語中,包是專為提供一種方法來保持一組名從另一個分開的。在一個包中宣告的符號將不會與另一個宣告的相同的符號相衝突。這樣的包減少獨立的程式碼模組之間的命名衝突。
LISP讀取器會維護所有已發現的符號表。當它找到一個新的字元序列,它在符號表中建立一個新的符號和儲存。這個表被稱為一個包。
當前包是由特殊變數*package*參照。
有兩個預定義的包在LISP:
common-lisp - it包含了所有已定義的函式和變數符號。
common-lisp-user - it 採用了common-lisp包和其他所有的包與編輯和偵錯工具;它簡稱為cl-user
下表提供了用於建立,使用和操作封裝最常用的功能:
SL No | 函式和說明 |
---|---|
1 |
make-package package-name &key :nicknames :use 它建立並使用指定的包名返回一個新的包。 |
2 |
in-package package-name &key :nicknames :use 使得當前的程式包。 |
3 |
in-package name 這個巨集的原因*package*設定為名為name的包,它必須是一個符號或字串。 |
4 |
find-package name 它搜尋一個包。返回包的名稱或暱稱;如果沒有這樣的程式包是否存在,find-package返回nil |
5 |
rename-package package new-name &optional new-nicknames 它重新命名一個包。 |
6 |
list-all-packages 該函式返回一個當前存在於Lisp語言系統中的所有包的列表。 |
7 |
delete-package package 它會刪除一個包 |
defpackage函式用於建立一個使用者定義的程式包。它的語法如下:
defpackage :package-name (:use :common-lisp ...) (:export :symbol1 :symbol2 ...))
那麼,
package-name是包的名稱。
:use 關鍵字指定此包需要的包,即定義在此包中使用包的程式碼函式。
:export 關鍵字指定為外部在這個包中的符號。
make-package函式也可用於建立一個包。其語法函式:
make-package package-name &key :nicknames :use
引數和關鍵字具有相同的含義。
一旦建立了一個包,則可以使用程式碼在這個包中,使其成為當前包。in-package巨集使得環境中的當前程式包。
範例
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(make-package :tom) (make-package :dick) (make-package :harry) (in-package tom) (defun hello () (write-line "Hello! This is Tom's Tutorials Yiibai") ) (hello) (in-package dick) (defun hello () (write-line "Hello! This is Dick's Tutorials Yiibai") ) (hello) (in-package harry) (defun hello () (write-line "Hello! This is Harry's Tutorials Yiibai") ) (hello) (in-package tom) (hello) (in-package dick) (hello) (in-package harry) (hello)
當執行程式碼,它返回以下結果:
Hello! This is Tom's Tutorials Yiibai Hello! This is Dick's Tutorials Yiibai Hello! This is Harry's Tutorials Yiibai
delete-package巨集允許刪除一個包。下面的例子演示了這一點:
範例
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(make-package :tom) (make-package :dick) (make-package :harry) (in-package tom) (defun hello () (write-line "Hello! This is Tom's Tutorials Yiibai") ) (in-package dick) (defun hello () (write-line "Hello! This is Dick's Tutorials Yiibai") ) (in-package harry) (defun hello () (write-line "Hello! This is Harry's Tutorials Yiibai") ) (in-package tom) (hello) (in-package dick) (hello) (in-package harry) (hello) (delete-package tom) (in-package tom) (hello)
當執行程式碼,它返回以下結果:
Hello! This is Tom's Tutorials Yiibai Hello! This is Dick's Tutorials Yiibai Hello! This is Harry's Tutorials Yiibai *** - EVAL: variable TOM has no value