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
廣告
© . All rights reserved.