CURRENT-PACKAGE.html -- ACL2 Version 6.3

## CURRENT-PACKAGE

the package used for reading and printing

    Major Section:  MISCELLANEOUS

`Current-package` is an `ld` special (see ld). The accessor is `(current-package state)` and the updater is `(set-current-package val state)`, or more conventionally, `(in-package val)`. The value of `current-package` is actually the string that names the package. (Common Lisp's ``package'' objects do not exist in ACL2.) The current package must be known to ACL2, i.e., it must be one of the initial packages or a package defined with `defpkg` by the user.

When printing symbols, the package prefix is displayed if it is not the `current-package` and may be optionally displayed otherwise. Thus, if `current-package` is `"ACL2"` then the symbol `'ACL2::SYMB` may be printed as `SYMB` or `ACL2::SYMB`, while `'MY-PKG::SYMB` must be printed as `MY-PKG::SYMB`. But if `current-package` is `"MY-PKG"` then the former symbol must be printed as `ACL2::SYMB` while the latter may be printed as `SYMB`.

In Common Lisp, `current-package` also affects how objects are read from character streams. Roughly speaking, read and print are inverses if the `current-package` is fixed, so reading from a stream produced by printing an object must produce an equal object.

In ACL2, the situation is more complicated because we never read objects from character streams, we only read them from object ``streams'' (channels). Logically speaking, the objects in such a channel are fixed regardless of the setting of `current-package`. However, our host file systems do not support the idea of Lisp object files and instead only support character files. So when you open an object input channel to a given (character file) we must somehow convert it to a list of ACL2 objects. This is done by a deus ex machina (``a person or thing that appears or is introduced suddenly and unexpectedly and provides a contrived solution to an apparently insoluble difficulty,'' Webster's Ninth New Collegiate Dictionary). Roughly speaking, the deus ex machina determines what sequence of calls to `read-object` will occur in the future and what the `current-package` will be during each of those calls, and then produces a channel containing the sequence of objects produced by an analogous sequence of Common Lisp reads with `*current-package*` bound appropriately for each.

A simple rule suffices to make sane file io possible: before you read an object from an object channel to a file created by printing to a character channel, make sure the `current-package` at read-time is the same as it was at print-time.