Next: Feature conditional, Previous: Definitions, Up: Core syntax [Contents][Index]
[R7RS base]
Reads filename … at compile-time, and insert their
contents as if the forms are placed in the includer’s source file,
surrounded by begin. The include form reads files
as is, while include-ci reads files in case-insensitive
way, as if #!fold-case is specified in the beginning of the
file (see Case-sensitivity).
The coding magic comment in each file is honored while reading that file (see Multibyte scripts).
If filename is absolute, the file is just searched. If it
is relative, the file
is first searched relative to the file containing the include
form, then the directories in *load-path* are tried.
Example: Suppose a file a.scm contains the following code:
(define x 0) (define y 1)
You can include this file into another source, like this:
(define (foo) (include "a.scm") (list x y))
It works as if the source is written as follows:
(define (foo) (begin (define x 0) (define y 1)) (list x y))
(Note: In version 0.9.4, include behaved differently when
pathname begins with either ./ or ../—in which case
the file is searched relative to the current working directory of the
compiler. It is rather an artifact of include sharing file
search routine with load. But unlike load, which is
a run-time operation, using relative path to the current directory
won’t make much sense for include, so we changed the behavior
in 0.9.5.)
Gauche has other means to incorporate source code from another files. Here’s the comparison.
require (use and extend calls require internally)require and include work at compile-time.
Require
works only in toplevel context, while include can be
anywhere.
Require reads the file only once (second and later require on the
same file becomes no-op), while include reads the file
every place it appears.
*load-path*. The location
of the file require form appears doesn’t matter.
(You can add directories relative to the requiring file
using the :relative flag in add-load-path, though).
select-module
inside the required file, it is only effective while the
required file is read. On the other hand, include
inserts any S-expressions in the included file to the
place include appears, so the effect of select-module
persists after include form (Note: Encoding magic comment
and #!fold-case/#!no-fold-case are dealt with by
the reader, so those effect is contained in the file even with
include).
require to insert
a toplevel binding without specifying a module. In other words,
the file you require should generally use define-module,
select-module or define-library.
See Require and provide, for further discussion.
On the other hand, include has no such restrictions.
loadinclude works at compile-time.
include can be
anywhere.
*load-path*, except when the
file begins with ./ or ../, in which case it is
first tried relative to the current directory before being searched
from *load-path*.
require, change of the current module
won’t persist after load.
Usually, require (or use and extend) are
better way to incorporate sources in other files. The include
form is mainly for the tricks that can’t be achieved with
require. For example, you have a third-party R5RS code
and you want to wrap it with Gauche module system. Using include,
you place the following small source file along the third-party code,
and you can load the code with (use third-party-module) without
changing the original code at all.
(define-module third-party-module (export proc ...) (include "third-party-source.scm"))
Next: Feature conditional, Previous: Definitions, Up: Core syntax [Contents][Index]