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 的包,该包必须是符号或字符串。

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