In general term of programming languages, a package is designed for providing a way to keep one set of names separate from another. The symbols declared in one package will not conflict with the same symbols declared in another. This way packages reduce the naming conflicts between independent code modules.
The LISP reader maintains a table of all the symbols it has found. When it finds a new character sequence, it creates a new symbol and stores in the symbol table. This table is called a package.
The current package is referred by the special variable *package*.
There are two predefined packages in LISP −
common-lisp − it contains symbols for all the functions and variables defined.
common-lisp-user − it uses the common-lisp package and all other packages with editing and debugging tools; it is called cl-user in short
The following table provides most commonly used functions used for creating, using and manipulating packages −
Sr.No. | Function and Description |
---|---|
1 | make-package package-name &key :nicknames :use It creates and returns a new package with the specified package name. |
2 | in-package package-name &key :nicknames :use Makes the package current. |
3 | in-package name This macro causes *package* to be set to the package named name, which must be a symbol or string. |
4 |
find-package name It searches for a package. The package with that name or nickname is returned; if no such package exists, find-package returns nil. |
5 |
rename-package package new-name &optional new-nicknames it renames a package. |
6 |
list-all-packages This function returns a list of all packages that currently exist in the Lisp system. |
7 |
delete-package package It deletes a package. |
The defpackage function is used for creating an user defined package. It has the following syntax −
(defpackage :package-name (:use :common-lisp ...) (:export :symbol1 :symbol2 ...) )
Where,
package-name is the name of the package.
The :use keyword specifies the packages that this package needs, i.e., packages that define functions used by code in this package.
The :export keyword specifies the symbols that are external in this package.
The make-package function is also used for creating a package. The syntax for this function is −
make-package package-name &key :nicknames :use
The arguments and keywords has same meaning as before.
Once you have created a package, you can use the code in this package, by making it the current package. The in-package macro makes a package current in the environment.
Create a new source code file named main.lisp and type the following code in it.
(make-package :tom) (make-package :dick) (make-package :harry) (in-package tom) (defun hello () (write-line "Hello! This is Tom's Howcodex") ) (hello) (in-package dick) (defun hello () (write-line "Hello! This is Dick's Howcodex") ) (hello) (in-package harry) (defun hello () (write-line "Hello! This is Harry's Howcodex") ) (hello) (in-package tom) (hello) (in-package dick) (hello) (in-package harry) (hello)
When you execute the code, it returns the following result −
Hello! This is Tom's Howcodex Hello! This is Dick's Howcodex Hello! This is Harry's Howcodex
The delete-package macro allows you to delete a package. The following example demonstrates this −
Create a new source code file named main.lisp and type the following code in it.
(make-package :tom) (make-package :dick) (make-package :harry) (in-package tom) (defun hello () (write-line "Hello! This is Tom's Howcodex") ) (in-package dick) (defun hello () (write-line "Hello! This is Dick's Howcodex") ) (in-package harry) (defun hello () (write-line "Hello! This is Harry's Howcodex") ) (in-package tom) (hello) (in-package dick) (hello) (in-package harry) (hello) (delete-package tom) (in-package tom) (hello)
When you execute the code, it returns the following result −
Hello! This is Tom's Howcodex Hello! This is Dick's Howcodex Hello! This is Harry's Howcodex *** - EVAL: variable TOM has no value