包裹(Packages)
在编程语言的一般术语中,包被设计用于提供使一组名称与另一组名称分离的方式。 在一个包中声明的符号不会与在另一个包中声明的相同符号冲突。 这样,包减少了独立代码模块之间的命名冲突。
LISP阅读器维护一个包含所有符号的表格。 当它找到新的字符序列时,它会创建一个新符号并存储在符号表中。 该表称为包。
当前包由特殊变量* package *引用。
LISP中有两个预定义的包 -
common-lisp - 它包含所有定义的函数和变量的符号。
common-lisp-user - 它使用common-lisp包和所有其他包以及编辑和调试工具; 它简称为cl-user
LISP中的包功能
下表提供了用于创建,使用和操作包的最常用函数 -
Sr.No. | 功能和描述 |
---|---|
1 | make-package package-name &key:nicknames:use 它创建并返回具有指定包名称的新包。 |
2 | in-package package-name和密钥:昵称:使用 使包最新。 |
3 | in-package name 此宏导致* package *设置为名为name的包,该包必须是符号或字符串。 |
4 | find-package name 它搜索一个包。 返回包含该名称或昵称的包; 如果不存在这样的包,则find-package返回nil。 |
5 | rename-package package new-name和可选的new-nicknames 它重命名一个包。 |
6 | list-all-packages 此函数返回Lisp系统中当前存在的所有包的列表。 |
7 | delete-package package 它删除了一个包。 |
创建LISP包
defpackage函数用于创建用户定义的包。 它具有以下语法 -
(defpackage :package-name
(:use :common-lisp ...)
(:export :symbol1 :symbol2 ...)
)
Where,
package-name是包的名称。
:use关键字指定此程序包所需的程序包,即定义此程序包中代码使用的函数的程序包。
:export关键字指定此包中的外部符号。
make-package函数也用于创建包。 这个函数的语法是 -
make-package package-name &key :nicknames :use
参数和关键字具有与以前相同的含义。
使用包
创建包后,可以使用此包中的代码,方法是将其作为当前包。 in-package宏使封装在环境中最新。
例子 (Example)
创建一个名为main.lisp的新源代码文件,并在其中键入以下代码。
(make-package :tom)
(make-package :dick)
(make-package :harry)
(in-package tom)
(defun hello ()
(write-line "Hello! This is Tom's IOWIKI")
)
(hello)
(in-package dick)
(defun hello ()
(write-line "Hello! This is Dick's IOWIKI")
)
(hello)
(in-package harry)
(defun hello ()
(write-line "Hello! This is Harry's IOWIKI")
)
(hello)
(in-package tom)
(hello)
(in-package dick)
(hello)
(in-package harry)
(hello)
执行代码时,它返回以下结果 -
Hello! This is Tom's IOWIKI
Hello! This is Dick's IOWIKI
Hello! This is Harry's IOWIKI
删除包
delete-package宏允许您删除包。 以下示例演示了这一点 -
例子 (Example)
创建一个名为main.lisp的新源代码文件,并在其中键入以下代码。
(make-package :tom)
(make-package :dick)
(make-package :harry)
(in-package tom)
(defun hello ()
(write-line "Hello! This is Tom's IOWIKI")
)
(in-package dick)
(defun hello ()
(write-line "Hello! This is Dick's IOWIKI")
)
(in-package harry)
(defun hello ()
(write-line "Hello! This is Harry's IOWIKI")
)
(in-package tom)
(hello)
(in-package dick)
(hello)
(in-package harry)
(hello)
(delete-package tom)
(in-package tom)
(hello)
执行代码时,它返回以下结果 -
Hello! This is Tom's IOWIKI
Hello! This is Dick's IOWIKI
Hello! This is Harry's IOWIKI
*** - EVAL: variable TOM has no value