|
(open-package package-id) | | exports | | = | | (id ...) | | | | | | #:only (id ...) | | | | | | #:all-defined | | | | | | #:all-defined-except (id ...) |
|
|
The define-package form is similar to module, except
that it can appear in any definition context. The forms
within a define-package form can be definitions or
expressions; definitions are not visible outside the
define-package form, but exports determines a subset
of the bindings that can be made visible outside the package using
the definition form (open-package package-id).
The (id ...) and #:only (id ...) exports
forms are equivalent: exactly the listed ids are
exported. The #:all-defined form exports all definitions from
the package body, and #:all-defined-except (id ...) exports
all definitions except the listed ids.
All of the usual definition forms work within a
define-package body, and such definitions are visible to all
expressions within the body (and, in particular, the definitions can
refer to each other). However, define-package handles
define*, define*-syntax, define*-values,
define*-syntaxes, and
open*-package specially: the bindings introduced by those
forms within a define-package body are visible only to
forms that appear later in the body, and they can shadow any
binding from preceding forms (even if the preceding binding
did not use one of the special * definition forms). If
an exported identifier is defined multiple times, the last definition
is the exported one.
Examples: |
| | > doll | reference to undefined identifier: doll | > robot | reference to undefined identifier: robot | > (open-package presents) | | > doll | "Molly Coddle" | > robot | reference to undefined identifier: robot | | | > (open-package big-russian-doll) | | > (open-package middle-russian-doll) | | > little-russian-doll | "Anastasia" |
|
A package-begin form can be used as an expression, but if it
is used in a context where definitions are allowed, then the
definitions are essentially spliced into the enclosing context (though
the defined bindings remain hidden outside the
package-begin).
Examples: |
| '("mimi") | > secret | reference to undefined identifier: secret |
|
The package? predicate returns #t if v is a
package value as obtained by syntax-local-value on an
identifier that is bound to a package.
Given such an identifier, the package-exported-identifiers
function returns a list of identifiers that correspond to the
bindings that would be introduced by opening the package in the
lexical context being expanded. The
package-original-identifiers function returns a parallel list
of identifiers for existing bindings of package’s exports.