- LISP 教程
- LISP - 首頁
- LISP - 概述
- LISP - 環境
- LISP - 程式結構
- LISP - 基本語法
- LISP - 資料型別
- LISP - 宏
- LISP - 變數
- LISP - 常量
- LISP - 運算子
- LISP - 決策
- LISP - 迴圈
- LISP - 函式
- LISP - 斷言
- LISP - 數字
- LISP - 字元
- LISP - 陣列
- LISP - 字串
- LISP - 序列
- LISP - 列表
- LISP - 符號
- LISP - 向量
- LISP - 集合
- LISP - 樹
- LISP - 雜湊表
- LISP - 輸入與輸出
- LISP - 檔案I/O
- LISP - 結構體
- LISP - 包
- LISP - 錯誤處理
- LISP - CLOS (公共Lisp物件系統)
- LISP 有用資源
- Lisp - 快速指南
- Lisp - 有用資源
- Lisp - 討論
LISP - 包
一般來說,在程式語言中,包的設計是為了提供一種方法來將一組名稱與另一組名稱分開。在一個包中宣告的符號不會與在另一個包中宣告的相同符號衝突。這樣,包減少了獨立程式碼模組之間的命名衝突。
LISP 讀取器維護一個它已找到的所有符號的表。當它找到一個新的字元序列時,它會建立一個新的符號並將其儲存在符號表中。這個表稱為包。
當前包由特殊變數 *package* 引用。
LISP 中有兩個預定義的包:
common-lisp - 它包含所有已定義函式和變數的符號。
common-lisp-user - 它使用 common-lisp 包和所有其他帶有編輯和除錯工具的包;簡稱 cl-user
LISP 中的包函式
下表提供了最常用的用於建立、使用和操作包的函式:
| 序號 | 函式和描述 |
|---|---|
| 1 | make-package package-name &key :nicknames :use 它建立一個並返回一個具有指定包名稱的新包。 |
| 2 | in-package package-name &key :nicknames :use 使該包成為當前包。 |
| 3 | in-package name 這個宏將 *package* 設定為名為 name 的包,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 它刪除一個包。 |
建立 LISP 包
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 Point") ) (hello) (in-package dick) (defun hello () (write-line "Hello! This is Dick's Tutorials Point") ) (hello) (in-package harry) (defun hello () (write-line "Hello! This is Harry's Tutorials Point") ) (hello) (in-package tom) (hello) (in-package dick) (hello) (in-package harry) (hello)
執行程式碼時,它將返回以下結果:
Hello! This is Tom's Tutorials Point Hello! This is Dick's Tutorials Point Hello! This is Harry's Tutorials Point
刪除包
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 Point") ) (in-package dick) (defun hello () (write-line "Hello! This is Dick's Tutorials Point") ) (in-package harry) (defun hello () (write-line "Hello! This is Harry's Tutorials Point") ) (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 Point Hello! This is Dick's Tutorials Point Hello! This is Harry's Tutorials Point *** - EVAL: variable TOM has no value