diff options
author | Ludovic Courtès <ludo@gnu.org> | 2009-08-10 19:24:34 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2009-08-10 19:24:34 +0200 |
commit | dab1ed3767c4fb8840401624e6c5a315e5cb5692 (patch) | |
tree | f845874e7634aa363be986ea3b6308aca54cf1dd | |
parent | 32be5735cd89931048f12283f3977c72cd292f77 (diff) | |
download | guile-dab1ed3767c4fb8840401624e6c5a315e5cb5692.tar.gz |
Change `defined?' to accept a module as its second argument.
Reported by Daniel Kraft <d@domob.eu>.
* doc/ref/api-binding.texi (Binding Reflection): Update documentation of
`defined?'.
* libguile/evalext.c (scm_defined_p): Expect a module as the second
argument, not a lexical environment.
-rw-r--r-- | doc/ref/api-binding.texi | 16 | ||||
-rw-r--r-- | libguile/evalext.c | 46 |
2 files changed, 21 insertions, 41 deletions
diff --git a/doc/ref/api-binding.texi b/doc/ref/api-binding.texi index b42f5567f..e53c48040 100644 --- a/doc/ref/api-binding.texi +++ b/doc/ref/api-binding.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the GNU Guile Reference Manual. -@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004 +@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2009 @c Free Software Foundation, Inc. @c See the file guile.texi for copying conditions. @@ -271,10 +271,16 @@ with duplicate bindings. Guile provides a procedure for checking whether a symbol is bound in the top level environment. -@c NJFIXME explain [env] -@deffn {Scheme Procedure} defined? sym [env] -@deffnx {C Function} scm_defined_p (sym, env) -Return @code{#t} if @var{sym} is defined in the lexical environment @var{env}. When @var{env} is not specified, look in the top-level environment as defined by the current module. +@deffn {Scheme Procedure} defined? sym [module] +@deffnx {C Function} scm_defined_p (sym, module) +Return @code{#t} if @var{sym} is defined in the module @var{module} or +the current module when @var{module} is not specified; otherwise return +@code{#f}. + +Up to Guile 1.8, the second optional argument had to be @dfn{lexical +environment} as returned by @code{the-environment}, for example. The +behavior of this function remains unchanged when the second argument is +omitted. @end deffn diff --git a/libguile/evalext.c b/libguile/evalext.c index 56f74e213..19d8f2e02 100644 --- a/libguile/evalext.c +++ b/libguile/evalext.c @@ -31,49 +31,23 @@ #include "libguile/evalext.h" SCM_DEFINE (scm_defined_p, "defined?", 1, 1, 0, - (SCM sym, SCM env), - "Return @code{#t} if @var{sym} is defined in the lexical " - "environment @var{env}. When @var{env} is not specified, " - "look in the top-level environment as defined by the " - "current module.") + (SCM sym, SCM module), + "Return @code{#t} if @var{sym} is defined in the module " + "@var{module} or the current module when @var{module} is not" + "specified.") #define FUNC_NAME s_scm_defined_p { SCM var; SCM_VALIDATE_SYMBOL (1, sym); - if (SCM_UNBNDP (env)) - var = scm_sym2var (sym, scm_current_module_lookup_closure (), - SCM_BOOL_F); + if (SCM_UNBNDP (module)) + module = scm_current_module (); else - { - SCM frames = env; - register SCM b; - for (; SCM_NIMP (frames); frames = SCM_CDR (frames)) - { - SCM_ASSERT (scm_is_pair (frames), env, SCM_ARG2, FUNC_NAME); - b = SCM_CAR (frames); - if (scm_is_true (scm_procedure_p (b))) - break; - SCM_ASSERT (scm_is_pair (b), env, SCM_ARG2, FUNC_NAME); - for (b = SCM_CAR (b); SCM_NIMP (b); b = SCM_CDR (b)) - { - if (!scm_is_pair (b)) - { - if (scm_is_eq (b, sym)) - return SCM_BOOL_T; - else - break; - } - if (scm_is_eq (SCM_CAR (b), sym)) - return SCM_BOOL_T; - } - } - var = scm_sym2var (sym, - SCM_NIMP (frames) ? SCM_CAR (frames) : SCM_BOOL_F, - SCM_BOOL_F); - } - + SCM_VALIDATE_MODULE (2, module); + + var = scm_module_variable (module, sym); + return (scm_is_false (var) || SCM_UNBNDP (SCM_VARIABLE_REF (var)) ? SCM_BOOL_F : SCM_BOOL_T); |