- 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