1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

Add parse-path-with-ellipsis, and use it for GUILE_LOAD_PATH et al.

* libguile/load.c (scm_ellipsis): New Variable.
  (scm_parse_path_with_ellipsis): New procedure.
  (scm_init_load): Initialize 'scm_ellipsis'.
  (scm_init_load_path): Use 'scm_parse_path_with_ellipsis' to
  handle GUILE_LOAD_PATH and GUILE_LOAD_COMPILED_PATH.

* libguile/load.h (scm_parse_path_with_ellipsis): Add prototype.

* doc/ref/guile-invoke.texi (Environment Variables):
  doc/ref/api-evaluation.texi (Load Paths): Add documentation.
  Correct description of default load path to reflect reality.
  Remove 'GUILE_LOAD_PATH' from the concept index; it is already
  in the variable index.  Add cross references between these two
  sections of the manual.
This commit is contained in:
Mark H Weaver 2012-11-28 18:01:35 -05:00
parent 99b94347f9
commit bd31bce6ac
4 changed files with 70 additions and 18 deletions

View file

@ -838,14 +838,16 @@ The procedure in the previous section look for Scheme code in the file
system at specific location. Guile also has some procedures to search system at specific location. Guile also has some procedures to search
the load path for code. the load path for code.
@cindex @env{GUILE_LOAD_PATH}
@defvar %load-path @defvar %load-path
List of directories which should be searched for Scheme modules and List of directories which should be searched for Scheme modules and
libraries. @code{%load-path} is initialized when Guile starts up to libraries. When Guile starts up, @code{%load-path} is initialized to
@code{(list (%site-dir) (%library-dir) (%package-data-dir))}, prepended the default load path @code{(list (%library-dir) (%site-dir)
with the contents of the @env{GUILE_LOAD_PATH} environment variable, if (%global-site-dir) (%package-data-dir))}. The @env{GUILE_LOAD_PATH}
it is set. @xref{Build Config}, for more on @code{%site-dir} and environment variable can be used to prepend or append additional
related procedures. directories (@pxref{Environment Variables}).
@xref{Build Config}, for more on @code{%site-dir} and related
procedures.
@end defvar @end defvar
@deffn {Scheme Procedure} load-from-path filename @deffn {Scheme Procedure} load-from-path filename
@ -913,7 +915,9 @@ using @code{load-compiled}.
@defvar %load-compiled-path @defvar %load-compiled-path
Like @code{%load-path}, but for compiled files. By default, this path Like @code{%load-path}, but for compiled files. By default, this path
has two entries: one for compiled files from Guile itself, and one for has two entries: one for compiled files from Guile itself, and one for
site packages. site packages. The @env{GUILE_LOAD_COMPILED_PATH} environment variable
can be used to prepend or append additional directories
(@pxref{Environment Variables}).
@end defvar @end defvar
When @code{primitive-load-path} searches the @code{%load-compiled-path} When @code{primitive-load-path} searches the @code{%load-compiled-path}
@ -943,6 +947,15 @@ a list and return the resulting list with @var{tail} appended. If
@var{path} is @code{#f}, @var{tail} is returned. @var{path} is @code{#f}, @var{tail} is returned.
@end deffn @end deffn
@deffn {Scheme Procedure} parse-path-with-ellipsis path base
@deffnx {C Function} scm_parse_path_with_ellipsis (path, base)
Parse @var{path}, which is expected to be a colon-separated string, into
a list and return the resulting list with @var{base} (a list) spliced in
place of the @code{...} path component, if present, or else @var{base}
is added to the end. If @var{path} is @code{#f}, @var{base} is
returned.
@end deffn
@deffn {Scheme Procedure} search-path path filename [extensions [require-exts?]] @deffn {Scheme Procedure} search-path path filename [extensions [require-exts?]]
@deffnx {C Function} scm_search_path (path, filename, rest) @deffnx {C Function} scm_search_path (path, filename, rest)
Search @var{path} for a directory containing a file named Search @var{path} for a directory containing a file named

View file

@ -295,8 +295,10 @@ variable. By default, the history file is @file{$HOME/.guile_history}.
@vindex GUILE_LOAD_COMPILED_PATH @vindex GUILE_LOAD_COMPILED_PATH
This variable may be used to augment the path that is searched for This variable may be used to augment the path that is searched for
compiled Scheme files (@file{.go} files) when loading. Its value should compiled Scheme files (@file{.go} files) when loading. Its value should
be a colon-separated list of directories, which will be prefixed to the be a colon-separated list of directories. If it contains the special
value of the default search path stored in @code{%load-compiled-path}. path component @code{...} (ellipsis), then the default path is put in
place of the ellipsis, otherwise the default path is placed at the end.
The result is stored in @code{%load-compiled-path} (@pxref{Load Paths}).
Here is an example using the Bash shell that adds the current directory, Here is an example using the Bash shell that adds the current directory,
@file{.}, and the relative directory @file{../my-library} to @file{.}, and the relative directory @file{../my-library} to
@ -312,18 +314,23 @@ $ guile -c '(display %load-compiled-path) (newline)'
@vindex GUILE_LOAD_PATH @vindex GUILE_LOAD_PATH
This variable may be used to augment the path that is searched for This variable may be used to augment the path that is searched for
Scheme files when loading. Its value should be a colon-separated list Scheme files when loading. Its value should be a colon-separated list
of directories, which will be prefixed to the value of the default of directories. If it contains the special path component @code{...}
search path stored in @code{%load-path}. (ellipsis), then the default path is put in place of the ellipsis,
otherwise the default path is placed at the end. The result is stored
in @code{%load-path} (@pxref{Load Paths}).
Here is an example using the Bash shell that adds the current directory Here is an example using the Bash shell that prepends the current
and the parent of the current directory to @code{%load-path}: directory to @code{%load-path}, and adds the relative directory
@file{../srfi} to the end:
@example @example
$ env GUILE_LOAD_PATH=".:.." \ $ env GUILE_LOAD_PATH=".:...:../srfi" \
guile -c '(display %load-path) (newline)' guile -c '(display %load-path) (newline)'
(. .. /usr/local/share/guile/2.0 \ (. /usr/local/share/guile/2.0 \
/usr/local/share/guile/site/2.0 \ /usr/local/share/guile/site/2.0 \
/usr/local/share/guile/site /usr/local/share/guile) /usr/local/share/guile/site \
/usr/local/share/guile \
../srfi)
@end example @end example
(Note: The line breaks, above, are for documentation purposes only, and (Note: The line breaks, above, are for documentation purposes only, and

View file

@ -221,6 +221,9 @@ static SCM *scm_loc_fresh_auto_compile;
/* The fallback path for auto-compilation */ /* The fallback path for auto-compilation */
static SCM *scm_loc_compile_fallback_path; static SCM *scm_loc_compile_fallback_path;
/* Ellipsis: "..." */
static SCM scm_ellipsis;
SCM_DEFINE (scm_parse_path, "parse-path", 1, 1, 0, SCM_DEFINE (scm_parse_path, "parse-path", 1, 1, 0,
(SCM path, SCM tail), (SCM path, SCM tail),
"Parse @var{path}, which is expected to be a colon-separated\n" "Parse @var{path}, which is expected to be a colon-separated\n"
@ -243,6 +246,32 @@ SCM_DEFINE (scm_parse_path, "parse-path", 1, 1, 0,
} }
#undef FUNC_NAME #undef FUNC_NAME
SCM_DEFINE (scm_parse_path_with_ellipsis, "parse-path-with-ellipsis", 2, 0, 0,
(SCM path, SCM base),
"Parse @var{path}, which is expected to be a colon-separated\n"
"string, into a list and return the resulting list with\n"
"@var{base} (a list) spliced in place of the @code{...} path\n"
"component, if present, or else @var{base} is added to the end.\n"
"If @var{path} is @code{#f}, @var{base} is returned.")
#define FUNC_NAME s_scm_parse_path_with_ellipsis
{
SCM lst = scm_parse_path (path, SCM_EOL);
SCM walk = lst;
SCM *prev = &lst;
while (!scm_is_null (walk) &&
scm_is_false (scm_equal_p (scm_car (walk), scm_ellipsis)))
{
prev = SCM_CDRLOC (walk);
walk = *prev;
}
*prev = scm_is_null (walk)
? base
: scm_append (scm_list_2 (base, scm_cdr (walk)));
return lst;
}
#undef FUNC_NAME
/* Initialize the global variable %load-path, given the value of the /* Initialize the global variable %load-path, given the value of the
SCM_SITE_DIR and SCM_LIBRARY_DIR preprocessor symbols and the SCM_SITE_DIR and SCM_LIBRARY_DIR preprocessor symbols and the
@ -316,11 +345,11 @@ scm_init_load_path ()
env = getenv ("GUILE_LOAD_PATH"); env = getenv ("GUILE_LOAD_PATH");
if (env) if (env)
path = scm_parse_path (scm_from_locale_string (env), path); path = scm_parse_path_with_ellipsis (scm_from_locale_string (env), path);
env = getenv ("GUILE_LOAD_COMPILED_PATH"); env = getenv ("GUILE_LOAD_COMPILED_PATH");
if (env) if (env)
cpath = scm_parse_path (scm_from_locale_string (env), cpath); cpath = scm_parse_path_with_ellipsis (scm_from_locale_string (env), cpath);
*scm_loc_load_path = path; *scm_loc_load_path = path;
*scm_loc_load_compiled_path = cpath; *scm_loc_load_compiled_path = cpath;
@ -1047,6 +1076,8 @@ scm_init_load ()
scm_loc_fresh_auto_compile scm_loc_fresh_auto_compile
= SCM_VARIABLE_LOC (scm_c_define ("%fresh-auto-compile", SCM_BOOL_F)); = SCM_VARIABLE_LOC (scm_c_define ("%fresh-auto-compile", SCM_BOOL_F));
scm_ellipsis = scm_from_latin1_string ("...");
the_reader = scm_make_fluid_with_default (SCM_BOOL_F); the_reader = scm_make_fluid_with_default (SCM_BOOL_F);
scm_c_define("current-reader", the_reader); scm_c_define("current-reader", the_reader);

View file

@ -27,6 +27,7 @@
SCM_API SCM scm_parse_path (SCM path, SCM tail); SCM_API SCM scm_parse_path (SCM path, SCM tail);
SCM_API SCM scm_parse_path_with_ellipsis (SCM path, SCM base);
SCM_API SCM scm_primitive_load (SCM filename); SCM_API SCM scm_primitive_load (SCM filename);
SCM_API SCM scm_c_primitive_load (const char *filename); SCM_API SCM scm_c_primitive_load (const char *filename);
SCM_API SCM scm_sys_package_data_dir (void); SCM_API SCM scm_sys_package_data_dir (void);