defpackage
(defpackage name (:use package...) (:export symbol...) (:nicknames name...) (:import-from package symbol...) (:local-nicknames (nick actual)...))
Defines a new package named name and returns the package -- its keyword, the same object find-package and make-package answer. Like in-package, it is a literal, top-level directive consumed at read/compile time, so packages are defined in source order. The name and the clause arguments are keywords, bare symbols, strings, or uninterned symbols (:mypkg, mypkg, "mypkg", #:mypkg — the last is the portable defpackage idiom).
(:use package...)makes the external (exported) symbols of the listed packages visible unqualified. The used packages must already exist. Without a:useclause nothing is visible unqualified — write(:use :cl)to use the standard symbols without acl:prefix.common-lispandcommon-lisp-userare built-in nicknames forclandcl-user, so(:use #:common-lisp)works too.(:export symbol...)declares the package's external symbols: they are reachable asname:symbolfrom other packages, and inherited by packages that use this one. Symbols interned later (for exampledefuns made under(in-package name)that are not in the:exportclause) are internal and require the double colon,name::symbol. A name the package inherits rather than defines (a standard name throughcl, or a used package's export) is re-exported, so(:use :cl) (:export #:car)makesname:carthe standardcar.(:nicknames name...)registers alternate names for the package; a nickname resolves everywhere the canonical name does. A nickname that collides with an existing package (or nickname) is an error; the built-in nicknames —common-lispandcommon-lisp-user(cl/cl-user),rl(rontolisp),la(linalg) andquicklisp(ql) — are reserved the same way.(:import-from package symbol...)makes the named symbols ofpackagevisible unqualified without using the whole package. Resolution is textual: an imported name resolves to the source package's canonical spelling, so(:import-from #:common-lisp #:car)gives a use-nothing package justcar.(:local-nicknames (nick actual)...)registers a shorthand for another package, sonick:symbolresolves likeactual:symbol— the idiom libraries use to shorten long package names. Lite: the nickname is global (rontolisp has no per-package nickname scoping), so it follows the same collision rules as:nicknames. The same registration is available outside adefpackageasuiop:add-package-local-nickname.(:shadow symbol...)and(:shadowing-import-from package symbol...)make the named symbols resolve to this package's own (or the named package's) symbol inside it, ahead of thecltable and the use list.(:intern symbol...)adds a name the package owns without exporting it, soname::symbolreaches it andname:symboldoes not.(:documentation "...")and(:size n)are accepted and ignored.
A defpackage naming a package that already exists modifies it, as Common Lisp requires: the clauses are merged into what is there, so nothing the earlier definition declared is lost. (A name that is another package's nickname is still an error — adjusting through it would silently apply the definition to a package of a different name.) Any other clause is an error. A defpackage that is not top-level registers its package when the form around it runs — on the interpreter only; the compiled backends have no registry at run time and refuse it. See Packages for the full rules.