17.2 Libraries and Collections
A library is module declaration for use by multiple programs. Racket further groups libraries into collections that can be easily distributed and easily added to a local Racket installation.
Some collections are distributed via PLaneT. Such collections are referenced through a planet module path (see require) and are downloaded by Racket on demand.
Other collections are distributed with Racket, in which case each collection is a directory that is located in a "collects" directory relative to the Racket executable. A collection can also be installed in a user-specific directory. More generally, the search path for installed collections can be configured through the current-library-collection-paths parameter. In all of these cases, the collections are referenced through lib paths (see require).
For example, the following module uses the "getinfo.rkt" library module from the "setup" collection, and the "cards.rkt" library module from the "games" collection’s "cards" subcollection:
#lang racket |
(require (lib "setup/getinfo.rkt") |
(lib "games/cards/cards.rkt")) |
.... |
This example is more compactly and more commonly written as
#lang racket |
(require setup/getinfo |
games/cards/cards) |
.... |
When an identifier id is used in a require form, it is converted to (lib rel-string) where rel-string is the string form of id.
A rel-string in (lib rel-string) consists of one or more path elements that name collections, and then a final path element that names a library file; the path elements are separated by /. If rel-string contains no /s, then then /main.rkt is implicitly appended to the path. If rel-string contains / but does not end with a file suffix, then .rkt is implicitly appended to the path.
The translation of a planet or lib path to a module declaration is determined by the module name resolver, as specified by the current-module-name-resolver parameter.
For the default module name resolver, The search path for collections is determined by the current-library-collection-paths parameter. The list of paths in current-library-collection-paths is searched from first to last to locate the first collection in a rel-string. To find a sub-collection, the enclosing collection is first found; if the sub-collection is not present in the found enclosing collection, then the search continues by looking for another instance of the enclosing collection, and so on. In other words, the directory tree for each element in the search path is spliced together with the directory trees of other path elements. (The “splicing” of tress applies only to directories; a file within a collection is found only within the first instance of the collection.)
The value of the current-library-collection-paths parameter is initialized in the Racket executable to the result of (find-library-collection-paths).
| ||||||||||||||
pre-extras : (listof path-string?) = null | ||||||||||||||
post-extras : (listof path-string?) = null |
The path produced by (build-path (find-system-path 'addon-dir) (version) "collects") is the first element of the default collection path list, unless the value of the use-user-specific-search-paths parameter is #f.
Extra directories provided in pre-extras are included next to the default collection path list, converted to complete paths relative to the executable.
If the directory specified by (find-system-path 'collects-dir) is absolute, or if it is relative (to the executable) and it exists, then it is added to the end of the default collection path list.
Extra directories provided in post-extras are included last in the default collection path list, converted to complete paths relative to the executable.
If the PLTCOLLECTS environment variable is defined, it is combined with the default list using path-list-string->path-list. If it is not defined, the default collection path list (as constructed by the first three bullets above) is used directly.
Note that under Unix and Mac OS X, paths are separated by :, and under Windows by ;. Also, path-list-string->path-list splices the default paths at an empty path, for example, with many Unix shells you can set PLTCOLLECTS to ":`pwd`", "`pwd`:", or "`pwd`" to specify search the current directory after, before, or instead of the default paths, respectively.
(collection-path collection ...+) → path? |
collection : string? |
(current-library-collection-paths) |
→ (listof (and/c path? complete-path?)) |
(current-library-collection-paths paths) → void? |
paths : (listof (and/c path? complete-path?)) |
(use-user-specific-search-paths) → boolean? |
(use-user-specific-search-paths on?) → void? |
on? : any/c |