commit 217cc7db1fc049865c3ec32257975c9f7a7ed4dd Author: Brian Templeton Date: Tue Jul 13 17:13:43 2010 -0400 wip diff --git a/libguile/variable.c b/libguile/variable.c index a97444c..6592647 100644 --- a/libguile/variable.c +++ b/libguile/variable.c @@ -40,16 +40,41 @@ scm_i_variable_print (SCM exp, SCM port, scm_print_state *pstate) scm_uintprint (SCM_UNPACK (exp), 16, port); scm_puts (" value: ", port); scm_iprin1 (SCM_VARIABLE_REF (exp), port, pstate); + scm_puts (" fvalue: ", port); + scm_iprin1 (SCM_VARIABLE_FREF (exp), port, pstate); + scm_puts (" pvalue: ", port); + scm_iprin1 (SCM_VARIABLE_PREF (exp), port, pstate); scm_putc('>', port); } static SCM +make_variable_star (SCM init, SCM finit, SCM pinit) +{ + return scm_double_cell (scm_tc7_variable, + SCM_UNPACK (init), + SCM_UNPACK (finit), + SCM_UNPACK (pinit)); +} + +static SCM make_variable (SCM init) { - return scm_cell (scm_tc7_variable, SCM_UNPACK (init)); + return make_variable_star (init, SCM_UNDEFINED, SCM_UNDEFINED); +} + +SCM_DEFINE (scm_make_variable_star, "make-variable*", 6, 0, 0, + (SCM vinitp, SCM finitp, SCM pinitp, + SCM vinit, SCM finit, SCM pinit), + "") +#define FUNC_NAME s_scm_make_variable_star +{ + return make_variable_star ((scm_is_true (vinitp) ? vinit : SCM_UNDEFINED), + (scm_is_true (finitp) ? finit : SCM_UNDEFINED), + (scm_is_true (pinitp) ? pinit : SCM_UNDEFINED)); } +#undef FUNC_NAME SCM_DEFINE (scm_make_variable, "make-variable", 1, 0, 0, (SCM init), @@ -111,6 +136,64 @@ SCM_DEFINE (scm_variable_set_x, "variable-set!", 2, 0, 0, } #undef FUNC_NAME +SCM_DEFINE (scm_variable_fref, "variable-fref", 1, 0, 0, + (SCM var), + "Dereference @var{var} and return its function.\n" + "@var{var} must be a variable object; see @code{make-variable}\n" + "and @code{make-undefined-variable}.") +#define FUNC_NAME s_scm_variable_fref +{ + SCM val; + SCM_VALIDATE_VARIABLE (1, var); + val = SCM_VARIABLE_FREF (var); + if (val == SCM_UNDEFINED) + SCM_MISC_ERROR ("variable is funbound: ~S", scm_list_1 (var)); + return val; +} +#undef FUNC_NAME + +SCM_DEFINE (scm_variable_fset_x, "variable-fset!", 2, 0, 0, + (SCM var, SCM val), + "Set the function 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_fset_x +{ + SCM_VALIDATE_VARIABLE (1, var); + SCM_VARIABLE_FSET (var, val); + return SCM_UNSPECIFIED; +} +#undef FUNC_NAME + +SCM_DEFINE (scm_variable_pref, "variable-pref", 1, 0, 0, + (SCM var), + "Dereference @var{var} and return its property object.\n" + "@var{var} must be a variable object; see @code{make-variable}\n" + "and @code{make-undefined-variable}.") +#define FUNC_NAME s_scm_variable_pref +{ + SCM val; + SCM_VALIDATE_VARIABLE (1, var); + val = SCM_VARIABLE_PREF (var); + if (val == SCM_UNDEFINED) + SCM_MISC_ERROR ("variable is punbound: ~S", scm_list_1 (var)); + return val; +} +#undef FUNC_NAME + +SCM_DEFINE (scm_variable_pset_x, "variable-pset!", 2, 0, 0, + (SCM var, SCM val), + "Set the property object 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_pset_x +{ + SCM_VALIDATE_VARIABLE (1, var); + SCM_VARIABLE_PSET (var, val); + 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" diff --git a/libguile/variable.h b/libguile/variable.h index 8faced4..79de689 100644 --- a/libguile/variable.h +++ b/libguile/variable.h @@ -34,6 +34,10 @@ #define SCM_VARIABLE_REF(V) SCM_CELL_OBJECT_1 (V) #define SCM_VARIABLE_SET(V, X) SCM_SET_CELL_OBJECT_1 (V, X) #define SCM_VARIABLE_LOC(V) (SCM_CELL_OBJECT_LOC ((V), 1)) +#define SCM_VARIABLE_FREF(V) SCM_CELL_OBJECT_2 (V) +#define SCM_VARIABLE_FSET(V, X) SCM_SET_CELL_OBJECT_2 (V, X) +#define SCM_VARIABLE_PREF(V) SCM_CELL_OBJECT_3 (V) +#define SCM_VARIABLE_PSET(V, X) SCM_SET_CELL_OBJECT_3 (V, X) @@ -42,6 +46,10 @@ SCM_API SCM scm_make_undefined_variable (void); SCM_API SCM scm_variable_p (SCM obj); SCM_API SCM scm_variable_ref (SCM var); SCM_API SCM scm_variable_set_x (SCM var, SCM val); +SCM_API SCM scm_variable_fref (SCM var); +SCM_API SCM scm_variable_fset_x (SCM var, SCM val); +SCM_API SCM scm_variable_pref (SCM var); +SCM_API SCM scm_variable_pset_x (SCM var, SCM val); SCM_API SCM scm_variable_bound_p (SCM var); SCM_INTERNAL void scm_i_variable_print (SCM var, SCM port, scm_print_state *pstate);