* eval.c (scm_call_0, scm_call_1, scm_call_2, scm_call_3,
[bpt/guile.git] / libguile / variable.c
index f96415f..2a6da8c 100644 (file)
@@ -1,4 +1,4 @@
-/*     Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995,1996,1997,1998,2000,2001 Free Software Foundation, Inc.
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 \f
 
-#include <stdio.h>
-#include "_scm.h"
-#include "eq.h"
-#include "ports.h"
-#include "root.h"
-#include "smob.h"
+#include "libguile/_scm.h"
+#include "libguile/eq.h"
+#include "libguile/ports.h"
+#include "libguile/root.h"
+#include "libguile/smob.h"
+#include "libguile/deprecation.h"
 
-#include "validate.h"
-#include "variable.h"
+#include "libguile/validate.h"
+#include "libguile/variable.h"
 \f
+scm_t_bits scm_tc16_variable;
 
 static int
-prin_var (SCM exp,SCM port,scm_print_state *pstate)
+variable_print (SCM exp, SCM port, scm_print_state *pstate)
 {
   scm_puts ("#<variable ", port);
-  scm_intprint(SCM_UNPACK (exp), 16, port);
-  {
-    SCM val_cell;
-    val_cell = SCM_CDR(exp);
-    if (!SCM_UNBNDP (SCM_CAR (val_cell)))
-      {
-       scm_puts (" name: ", port);
-       scm_iprin1 (SCM_CAR (val_cell), port, pstate);
-      }
-    scm_puts (" binding: ", port);
-    scm_iprin1 (SCM_CDR (val_cell), port, pstate);
-  }
+  scm_intprint (SCM_UNPACK (exp), 16, port);
+  scm_puts (" binding: ", port);
+  scm_iprin1 (SCM_VARIABLE_REF (exp), port, pstate);
   scm_putc('>', port);
   return 1;
 }
 
-
-static SCM 
-scm_markvar (SCM ptr)
-{
-  return SCM_CDR (ptr);
-}
-
 static SCM
-var_equal (SCM var1, SCM var2)
+variable_equalp (SCM var1, SCM var2)
 {
-  return scm_equal_p (SCM_CDR (var1), SCM_CDR (var2));
+  return scm_equal_p (SCM_VARIABLE_REF (var1), SCM_VARIABLE_REF (var2));
 }
-
-int scm_tc16_variable;
 \f
 
-static SCM anonymous_variable_sym;
-
+#if SCM_ENABLE_VCELLS
+SCM_SYMBOL (sym_huh, "???");
+#endif
 
 static SCM
-make_vcell_variable (SCM vcell)
+make_variable (SCM init)
 {
-  SCM_RETURN_NEWSMOB (scm_tc16_variable, SCM_UNPACK (vcell));
+#if !SCM_ENABLE_VCELLS
+  SCM_RETURN_NEWSMOB (scm_tc16_variable, SCM_UNPACK (init));
+#else
+  SCM_RETURN_NEWSMOB (scm_tc16_variable, scm_cons (sym_huh, init));
+#endif
 }
 
-SCM_DEFINE (scm_make_variable, "make-variable", 1, 1, 0, 
-            (SCM init, SCM name_hint),
-            "Return a variable object initialized to value INIT.\n"
-            "If given, uses NAME-HINT as its internal (debugging)\n"
-            "name, otherwise just treat it as an anonymous variable.\n"
-            "Remember, of course, that multiple bindings to the same\n"
-            "variable may exist, so NAME-HINT is just that---a hint.\n")
+SCM_DEFINE (scm_make_variable, "make-variable", 1, 0, 0, 
+            (SCM init),
+            "Return a variable initialized to value @var{init}.\n")
 #define FUNC_NAME s_scm_make_variable
 {
-  SCM val_cell;
-  
-  if (SCM_UNBNDP (name_hint))
-    name_hint = anonymous_variable_sym;
-
-  SCM_NEWCELL(val_cell);
-  SCM_DEFER_INTS;
-  SCM_SETCAR (val_cell, name_hint);
-  SCM_SETCDR (val_cell, init);
-  SCM_ALLOW_INTS;
-  return make_vcell_variable (val_cell);
+  return make_variable (init);
 }
 #undef FUNC_NAME
 
 
-SCM_DEFINE (scm_make_undefined_variable, "make-undefined-variable", 0, 1, 0, 
-            (SCM name_hint),
-            "Return a variable object initialized to an undefined value.\n"
-            "If given, uses NAME-HINT as its internal (debugging)\n"
-            "name, otherwise just treat it as an anonymous variable.\n"
-            "Remember, of course, that multiple bindings to the same\n"
-            "variable may exist, so NAME-HINT is just that---a hint.\n")
+SCM_DEFINE (scm_make_undefined_variable, "make-undefined-variable", 0, 0, 0, 
+            (),
+            "Return a variable that is initially unbound.\n")
 #define FUNC_NAME s_scm_make_undefined_variable
 {
-  SCM vcell;
-
-  if (SCM_UNBNDP (name_hint))
-    name_hint = anonymous_variable_sym;
-
-  SCM_NEWCELL (vcell);
-  SCM_DEFER_INTS;
-  SCM_SETCAR (vcell, name_hint);
-  SCM_SETCDR (vcell, SCM_UNDEFINED);
-  SCM_ALLOW_INTS;
-  return make_vcell_variable (vcell);
+  return make_variable (SCM_UNDEFINED);
 }
 #undef FUNC_NAME
 
 
 SCM_DEFINE (scm_variable_p, "variable?", 1, 0, 0, 
             (SCM obj),
-            "Return #t iff OBJ is a variable object, else return #f\n")
+            "Return @code{#t} iff @var{obj} is a variable object, else\n"
+           "return @code{#f}\n")
 #define FUNC_NAME s_scm_variable_p
 {
-  return SCM_BOOL(SCM_VARIABLEP (obj));
+  return SCM_BOOL (SCM_VARIABLEP (obj));
 }
 #undef FUNC_NAME
 
 
 SCM_DEFINE (scm_variable_ref, "variable-ref", 1, 0, 0, 
             (SCM var),
-            "Dereference VAR and return its value.\n"
-            "VAR must be a variable object;  see `make-variable' and\n"
-            "`make-undefined-variable'")
+            "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_VALIDATE_VARIABLE (1,var);
-  return SCM_CDR (SCM_CDR (var));
+  SCM val;
+  SCM_VALIDATE_VARIABLE (1, var);
+  val = SCM_VARIABLE_REF (var);
+  if (val == SCM_UNDEFINED)
+    SCM_MISC_ERROR ("variable is unbound: ~S", SCM_LIST1 (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 to VAL.\n"
-            "VAR must be a variable object, VAL can be any value.\n"
-            "Returns an unspecified value.\n")
+            "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.\n")
 #define FUNC_NAME s_scm_variable_set_x
 {
-  SCM_VALIDATE_VARIABLE (1,var);
-  SCM_SETCDR (SCM_CDR (var), val);
+  SCM_VALIDATE_VARIABLE (1, var);
+  SCM_VARIABLE_SET (var, val);
   return SCM_UNSPECIFIED;
 }
 #undef FUNC_NAME
 
-
-SCM_DEFINE (scm_builtin_variable, "builtin-variable", 1, 0, 0, 
-            (SCM name),
-            "Return the built-in variable with the name NAME.\n"
-            "NAME must be a symbol (not a string).\n"
-            "Then use `variable-ref' to access its value.\n")
-#define FUNC_NAME s_scm_builtin_variable
+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.\n")
+#define FUNC_NAME s_scm_variable_bound_p
 {
-  SCM vcell;
-  SCM var_slot;
-
-  SCM_VALIDATE_SYMBOL (1,name);
-  vcell = scm_sym2vcell (name, SCM_BOOL_F, SCM_BOOL_T);
-  if (SCM_FALSEP (vcell))
-    return SCM_BOOL_F;
-
-  scm_intern_symbol (scm_symhash_vars, name);
-  var_slot = scm_sym2ovcell (name, scm_symhash_vars);
-
-  SCM_DEFER_INTS;
-  if (SCM_IMP (SCM_CDR (var_slot))
-      || !SCM_EQ_P (SCM_VARVCELL (var_slot), vcell))
-    SCM_SETCDR (var_slot, make_vcell_variable (vcell));
-  SCM_ALLOW_INTS;
-
-  return SCM_CDR (var_slot);
+  SCM_VALIDATE_VARIABLE (1, var);
+  return SCM_BOOL (SCM_VARIABLE_REF (var) != SCM_UNDEFINED);
 }
 #undef FUNC_NAME
 
-
-SCM_DEFINE (scm_variable_bound_p, "variable-bound?", 1, 0, 0, 
-            (SCM var),
-            "Return #t iff VAR is bound to a value.\n"
-            "Throws an error if VAR is not a variable object.\n")
-#define FUNC_NAME s_scm_variable_bound_p
+SCM_DEFINE (scm_variable_set_name_hint, "variable-set-name-hint!", 2, 0, 0,
+           (SCM var, SCM hint),
+           "Do not use this function.")
+#define FUNC_NAME s_scm_variable_set_name_hint
 {
-  SCM_VALIDATE_VARIABLE (1,var);
-  return SCM_NEGATE_BOOL(SCM_UNBNDP (SCM_CDR (SCM_VARVCELL (var))));
+  SCM_VALIDATE_VARIABLE (1, var);
+  SCM_VALIDATE_SYMBOL (2, hint);
+#if SCM_ENABLE_VCELLS
+  SCM_SETCAR (SCM_SMOB_DATA (var), hint);
+#endif
+  return SCM_UNSPECIFIED;
 }
 #undef FUNC_NAME
 
+#if SCM_ENABLE_VCELLS
 
+SCM_DEFINE (scm_builtin_variable, "builtin-variable", 1, 0, 0, 
+            (SCM name),
+            "Return the built-in variable with the name @var{name}.\n"
+            "@var{name} must be a symbol (not a string).\n"
+            "Then use @code{variable-ref} to access its value.\n")
+#define FUNC_NAME s_scm_builtin_variable
+{
+  SCM_VALIDATE_SYMBOL (1,name);
+  scm_c_issue_deprecation_warning ("`builtin-variable' is deprecated. "
+                                  "Use module system operations instead.");
+  return scm_sym2var (name, SCM_BOOL_F, SCM_BOOL_T);
+}
+#undef FUNC_NAME
 
+#endif /* SCM_ENABLE_VCELLS */
 
 void
 scm_init_variable ()
 {
-  scm_tc16_variable = scm_make_smob_type_mfpe ("variable", 0,
-                                              scm_markvar, NULL, prin_var, var_equal);
-  anonymous_variable_sym = SCM_CAR (scm_sysintern ("anonymous-variable", SCM_UNDEFINED));
-#include "variable.x"
+  scm_tc16_variable = scm_make_smob_type ("variable", 0);
+  scm_set_smob_mark (scm_tc16_variable, scm_markcdr);
+  scm_set_smob_print (scm_tc16_variable, variable_print);
+  scm_set_smob_equalp (scm_tc16_variable, variable_equalp);
+
+#ifndef SCM_MAGIC_SNARFER
+#include "libguile/variable.x"
+#endif
 }
 
-
 /*
   Local Variables:
   c-file-style: "gnu"