mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-10 14:00:21 +02:00
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.
This commit is contained in:
parent
32be5735cd
commit
dab1ed3767
2 changed files with 21 additions and 41 deletions
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue