diff options
Diffstat (limited to 'libguile/variable.c')
-rw-r--r-- | libguile/variable.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/libguile/variable.c b/libguile/variable.c new file mode 100644 index 000000000..96c6bfe7d --- /dev/null +++ b/libguile/variable.c @@ -0,0 +1,146 @@ +/* Copyright 1995-1998,2000-2001,2006,2008,2011,2018 + Free Software Foundation, Inc. + + This file is part of Guile. + + Guile is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Guile is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with Guile. If not, see + <https://www.gnu.org/licenses/>. */ + + + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "boolean.h" +#include "deprecation.h" +#include "eq.h" +#include "gsubr.h" +#include "list.h" +#include "ports.h" +#include "smob.h" + +#include "variable.h" + + + + +void +scm_i_variable_print (SCM exp, SCM port, scm_print_state *pstate) +{ + scm_puts ("#<variable ", port); + scm_uintprint (SCM_UNPACK (exp), 16, port); + scm_puts (" value: ", port); + scm_iprin1 (SCM_VARIABLE_REF (exp), port, pstate); + scm_putc ('>', port); +} + + + +static SCM +make_variable (SCM init) +{ + return scm_cell (scm_tc7_variable, SCM_UNPACK (init)); +} + +SCM_DEFINE (scm_make_variable, "make-variable", 1, 0, 0, + (SCM init), + "Return a variable initialized to value @var{init}.") +#define FUNC_NAME s_scm_make_variable +{ + return make_variable (init); +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_make_undefined_variable, "make-undefined-variable", 0, 0, 0, + (), + "Return a variable that is initially unbound.") +#define FUNC_NAME s_scm_make_undefined_variable +{ + return make_variable (SCM_UNDEFINED); +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_variable_p, "variable?", 1, 0, 0, + (SCM obj), + "Return @code{#t} iff @var{obj} is a variable object, else\n" + "return @code{#f}.") +#define FUNC_NAME s_scm_variable_p +{ + return scm_from_bool (SCM_VARIABLEP (obj)); +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_variable_ref, "variable-ref", 1, 0, 0, + (SCM var), + "Dereference @var{var} and return its value.\n" + "@var{var} must be a variable object; see @code{make-variable}\n" + "and @code{make-undefined-variable}.") +#define FUNC_NAME s_scm_variable_ref +{ + SCM val; + SCM_VALIDATE_VARIABLE (1, var); + val = SCM_VARIABLE_REF (var); + if (scm_is_eq (val, SCM_UNDEFINED)) + SCM_MISC_ERROR ("variable is unbound: ~S", scm_list_1 (var)); + return val; +} +#undef FUNC_NAME + +SCM_DEFINE (scm_variable_set_x, "variable-set!", 2, 0, 0, + (SCM var, SCM val), + "Set the value of the variable @var{var} to @var{val}.\n" + "@var{var} must be a variable object, @var{val} can be any\n" + "value. Return an unspecified value.") +#define FUNC_NAME s_scm_variable_set_x +{ + SCM_VALIDATE_VARIABLE (1, var); + SCM_VARIABLE_SET (var, val); + return SCM_UNSPECIFIED; +} +#undef FUNC_NAME + +SCM_DEFINE (scm_variable_unset_x, "variable-unset!", 1, 0, 0, + (SCM var), + "Ensure that @var{var} is not bound to a value.\n" + "@var{var} must be a variable object.") +#define FUNC_NAME s_scm_variable_unset_x +{ + SCM_VALIDATE_VARIABLE (1, var); + SCM_VARIABLE_SET (var, SCM_UNDEFINED); + return SCM_UNSPECIFIED; +} +#undef FUNC_NAME + +SCM_DEFINE (scm_variable_bound_p, "variable-bound?", 1, 0, 0, + (SCM var), + "Return @code{#t} iff @var{var} is bound to a value.\n" + "Throws an error if @var{var} is not a variable object.") +#define FUNC_NAME s_scm_variable_bound_p +{ + SCM_VALIDATE_VARIABLE (1, var); + return scm_from_bool (!scm_is_eq (SCM_VARIABLE_REF (var), SCM_UNDEFINED)); +} +#undef FUNC_NAME + + +void +scm_init_variable () +{ +#include "variable.x" +} |