|
|
|
|
# Exports: `provide`
|
|
|
|
|
|
|
|
|
|
By default, all of a module’s definitions are private to the module. The
|
|
|
|
|
`provide` form specifies definitions to be made available where the
|
|
|
|
|
module is `require`d.
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
(provide provide-spec ...)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
A `provide` form can only appear at module level \(i.e., in the
|
|
|
|
|
immediate body of a `module`\). Specifying multiple `provide-spec`s in
|
|
|
|
|
a single `provide` is exactly the same as using multiple `provide`s each
|
|
|
|
|
with a single `provide-spec`.
|
|
|
|
|
|
|
|
|
|
Each identifier can be exported at most once from a module across all
|
|
|
|
|
`provide`s within the module. More precisely, the external name for each
|
|
|
|
|
export must be distinct; the same internal binding can be exported
|
|
|
|
|
multiple times with different external names.
|
|
|
|
|
|
|
|
|
|
The allowed shape of a `provide-spec` is defined recursively:
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
identifier
|
|
|
|
|
```
|
|
|
|
|
In its simplest form, a `provide-spec` indicates a binding within its
|
|
|
|
|
module to be exported. The binding can be from either a local
|
|
|
|
|
definition, or from an import.
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
(rename-out [orig-id export-id] ...)
|
|
|
|
|
```
|
|
|
|
|
A `rename-out` form is similar to just specifying an identifier, but the
|
|
|
|
|
exported binding `orig-id` is given a different name, `export-id`, to
|
|
|
|
|
importing modules.
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
(struct-out struct-id)
|
|
|
|
|
```
|
|
|
|
|
A `struct-out` form exports the bindings created by `(struct struct-id
|
|
|
|
|
....)`.
|
|
|
|
|
> +See \[missing\] for information on `define-struct`.
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
(all-defined-out)
|
|
|
|
|
```
|
|
|
|
|
The `all-defined-out` shorthand exports all bindings that are defined
|
|
|
|
|
within the exporting module \(as opposed to imported\).
|
|
|
|
|
Use of the `all-defined-out` shorthand is generally discouraged, because
|
|
|
|
|
it makes less clear the actual exports for a module, and because Racket
|
|
|
|
|
programmers get into the habit of thinking that definitions can be added
|
|
|
|
|
freely to a module without affecting its public interface \(which is not
|
|
|
|
|
the case when `all-defined-out` is used\).
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
(all-from-out module-path)
|
|
|
|
|
```
|
|
|
|
|
The `all-from-out` shorthand exports all bindings in the module that
|
|
|
|
|
were imported using a `require-spec` that is based on `module-path`.
|
|
|
|
|
Although different `module-path`s could refer to the same file-based
|
|
|
|
|
module, re-exporting with `all-from-out` is based specifically on the
|
|
|
|
|
`module-path` reference, and not the module that is actually referenced.
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
(except-out provide-spec id ...)
|
|
|
|
|
```
|
|
|
|
|
Like `provide-spec`, but omitting the export of each `id`, where `id` is
|
|
|
|
|
the external name of the binding to omit.
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
(prefix-out prefix-id provide-spec)
|
|
|
|
|
```
|
|
|
|
|
Like `provide-spec`, but adding `prefix-id` to the beginning of the
|
|
|
|
|
external name for each exported binding.
|