I'm a little hazy on the differences between (use)
and (import)
in Chicken. Similarly, how do (load)
, (require)
and (require-extension)
differ?
These things don't seem to be mentioned much on the website.
Load
and require
are purely run-time, procedural actions. Load
accepts a string argument and loads the file with that name (which can be source or compiled code) into the running Scheme, so that whatever it defines becomes available. Require
does the same thing, but checks if the file has already been loaded by seeing if provide
has been called on the same name (typically by the file as it is loaded). They are relatively rare in Scheme programming, corresponding to plug-ins in other languages, where code unknown at compile time needs to be loaded. See the manual page for unit eval
for more details.
Import
is concerned with modules rather than files. It looks for the named module, which must have already been loaded (but see below for Chicken 5), and makes the names exported from that module visible in the current context. In order to successfully import a module, there must be an import library for it. It is syntax, so the module name must appear explicitly in the call and cannot be computed at run time. See the manual page on modules for more details.
Require-library
does the Right Thing to load code. If the code is already part of the running Scheme, either because it is built into Chicken, it does nothing. Otherwise it will load a core library unit if there is one, or will call require
as a last resort. At compile time, it does analogous things to make sure that the environment will be correct at run time. See the "Non-standard macros and special forms" page in the manual for more details.
Use
does a require-library
followed by an import
on the same name. It is the most common way to add functionality to your Chicken program. However, we write (import scheme)
and (import chicken)
because the functionality of these modules is already loaded. Require-extension
is an exact synonym for use
, provided for SRFI 55 compatibility. In R7RS mode, import
is also a synonym for use
.
Update for Chicken 5
Use
has been removed from the language, and import
now does what use
used to do: it loads (if necessary) and then imports. Require-extension
is consequently now a synonym for import
.
In addition, Chicken-specific procedures and macros have been broken into modules with names like (chicken base)
and (chicken bitwise)
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With