* __scm.h, alist.c, alist.h, append.c, append.h, appinit.c,
[bpt/guile.git] / libguile / variable.c
CommitLineData
0f2d19dd
JB
1/* Copyright (C) 1995,1996 Free Software Foundation, Inc.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
6 * any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; see the file COPYING. If not, write to
15 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
16 *
17 * As a special exception, the Free Software Foundation gives permission
18 * for additional uses of the text contained in its release of GUILE.
19 *
20 * The exception is that, if you link the GUILE library with other files
21 * to produce an executable, this does not by itself cause the
22 * resulting executable to be covered by the GNU General Public License.
23 * Your use of that executable is in no way restricted on account of
24 * linking the GUILE library code into it.
25 *
26 * This exception does not however invalidate any other reasons why
27 * the executable file might be covered by the GNU General Public License.
28 *
29 * This exception applies only to the code released by the
30 * Free Software Foundation under the name GUILE. If you copy
31 * code from other Free Software Foundation releases into a copy of
32 * GUILE, as the General Public License permits, the exception does
33 * not apply to the code that you add in this way. To avoid misleading
34 * anyone as to the status of such modified files, you must delete
35 * this exception notice from them.
36 *
37 * If you write modifications of your own for GUILE, it is your choice
38 * whether to permit this exception to apply to your modifications.
39 * If you do not wish that, delete this exception notice.
40 */
41\f
42
43#include <stdio.h>
44#include "_scm.h"
20e6290e
JB
45#include "genio.h"
46#include "smob.h"
0f2d19dd 47
20e6290e 48#include "variable.h"
0f2d19dd
JB
49\f
50#ifdef __STDC__
51static scm_sizet
52free_var (SCM obj)
53#else
54static scm_sizet
55free_var (obj)
56 SCM obj;
57#endif
58{
59 return 0;
60}
61
62
63#ifdef __STDC__
64static int
9882ea19 65prin_var (SCM exp, SCM port, scm_print_state *pstate)
0f2d19dd
JB
66#else
67static int
9882ea19 68prin_var (exp, port, pstate)
0f2d19dd
JB
69 SCM exp;
70 SCM port;
9882ea19 71 scm_print_state *pstate;
0f2d19dd
JB
72#endif
73{
74 scm_gen_puts (scm_regular_string, "#<variable ", port);
75 scm_intprint(exp, 16, port);
76 {
77 SCM val_cell;
78 val_cell = SCM_CDR(exp);
79 if (SCM_CAR (val_cell) != SCM_UNDEFINED)
80 {
81 scm_gen_puts (scm_regular_string, " name: ", port);
9882ea19 82 scm_iprin1 (SCM_CAR (val_cell), port, pstate);
0f2d19dd
JB
83 }
84 scm_gen_puts (scm_regular_string, " binding: ", port);
9882ea19 85 scm_iprin1 (SCM_CDR (val_cell), port, pstate);
0f2d19dd
JB
86 }
87 scm_gen_putc('>', port);
88 return 1;
89}
90
91#ifdef __STDC__
92static SCM
93scm_markvar (SCM ptr)
94#else
95static SCM
96scm_markvar (ptr)
97 SCM ptr;
98#endif
99{
100 if (SCM_GC8MARKP (ptr))
101 return SCM_BOOL_F;
102 SCM_SETGC8MARK (ptr);
103 return SCM_CDR (ptr);
104}
105
106int scm_tc16_variable;
107static scm_smobfuns variable_smob = {scm_markvar, free_var, prin_var, 0};
108\f
109
110static SCM variable_sym;
111
112#ifdef __STDC__
113static SCM
114make_vcell_variable (SCM vcell)
115#else
116static SCM
117make_vcell_variable (vcell)
118 SCM vcell;
119#endif
120{
121 SCM answer;
122 SCM_NEWCELL(answer);
123 SCM_REDEFER_INTS;
124 SCM_CAR(answer) = scm_tc16_variable;
125 SCM_CDR(answer) = vcell;
126 SCM_REALLOW_INTS;
127 return answer;
128}
129
130SCM_PROC(s_make_variable, "make-variable", 2, 0, 0, scm_make_variable);
131#ifdef __STDC__
132SCM
133scm_make_variable (SCM init, SCM name_hint)
134#else
135SCM
136scm_make_variable (init, name_hint)
137 SCM init;
138 SCM name_hint;
139#endif
140{
141 SCM val_cell;
142 SCM_NEWCELL(val_cell);
143 SCM_DEFER_INTS;
144 SCM_CAR(val_cell) = name_hint;
145 SCM_CDR(val_cell) = init;
146 SCM_ALLOW_INTS;
147 return make_vcell_variable (val_cell);
148}
149
150
151SCM_PROC(s_make_undefined_variable, "make-undefined-variable", 0, 1, 0, scm_make_undefined_variable);
152#ifdef __STDC__
153SCM
154scm_make_undefined_variable (SCM name_hint)
155#else
156SCM
157scm_make_undefined_variable (name_hint)
158 SCM name_hint;
159#endif
160{
161 SCM vcell;
162
163 if (name_hint == SCM_UNDEFINED)
164 name_hint = variable_sym;
165
166 SCM_NEWCELL (vcell);
167 SCM_DEFER_INTS;
168 SCM_CAR (vcell) = name_hint;
169 SCM_CDR (vcell) = SCM_UNDEFINED;
170 SCM_ALLOW_INTS;
171 return make_vcell_variable (vcell);
172}
173
174
175SCM_PROC(s_variable_p, "variable?", 1, 0, 0, scm_variable_p);
176#ifdef __STDC__
177SCM
178scm_variable_p (SCM obj)
179#else
180SCM
181scm_variable_p (obj)
182 SCM obj;
183#endif
184{
185 return ( (SCM_NIMP(obj) && SCM_VARIABLEP (obj))
186 ? SCM_BOOL_T
187 : SCM_BOOL_F);
188}
189
190
191SCM_PROC(s_variable_ref, "variable-ref", 1, 0, 0, scm_variable_ref);
192#ifdef __STDC__
193SCM
194scm_variable_ref (SCM var)
195#else
196SCM
197scm_variable_ref (var)
198 SCM var;
199#endif
200{
201 SCM_ASSERT (SCM_NIMP(var) && SCM_VARIABLEP(var), var, SCM_ARG1, s_variable_ref);
202 return SCM_CDR (SCM_CDR (var));
203}
204
205
206
207SCM_PROC(s_variable_set_x, "variable-set!", 2, 0, 0, scm_variable_set_x);
208#ifdef __STDC__
209SCM
210scm_variable_set_x (SCM var, SCM val)
211#else
212SCM
213scm_variable_set_x (var, val)
214 SCM var;
215 SCM val;
216#endif
217{
218 SCM_ASSERT (SCM_NIMP(var) && SCM_VARIABLEP (var), var, SCM_ARG1, s_variable_set_x);
219 SCM_CDR (SCM_CDR (var)) = val;
220 return SCM_UNSPECIFIED;
221}
222
223
224SCM_PROC(s_builtin_variable, "builtin-variable", 1, 0, 0, scm_builtin_variable);
225#ifdef __STDC__
226SCM
227scm_builtin_variable (SCM name)
228#else
229SCM
230scm_builtin_variable (name)
231 SCM name;
232#endif
233{
234 SCM vcell;
235 SCM var_slot;
236
237 SCM_ASSERT (SCM_NIMP (name) && SCM_SYMBOLP (name), name, SCM_ARG1, s_builtin_variable);
238 vcell = scm_sym2vcell (name, SCM_BOOL_F, SCM_BOOL_T);
239 if (vcell == SCM_BOOL_F)
240 return SCM_BOOL_F;
241
242 scm_intern_symbol (scm_symhash_vars, name);
243 var_slot = scm_sym2ovcell (name, scm_symhash_vars);
244
245 SCM_DEFER_INTS;
246 if ( SCM_IMP (SCM_CDR (var_slot))
247 || (SCM_VARVCELL (var_slot) != vcell))
248 SCM_CDR (var_slot) = make_vcell_variable (vcell);
249 SCM_ALLOW_INTS;
250
251 return SCM_CDR (var_slot);
252}
253
254
255SCM_PROC(s_variable_bound_p, "variable-bound?", 1, 0, 0, scm_variable_bound_p);
256#ifdef __STDC__
257SCM
258scm_variable_bound_p (SCM var)
259#else
260SCM
261scm_variable_bound_p (var)
262 SCM var;
263#endif
264{
265 SCM_ASSERT (SCM_NIMP(var) && SCM_VARIABLEP (var), var, SCM_ARG1, s_variable_bound_p);
266 return (SCM_UNBNDP (SCM_CDR (SCM_VARVCELL (var)))
267 ? SCM_BOOL_F
268 : SCM_BOOL_T);
269}
270
271
272
273#ifdef __STDC__
274void
275scm_init_variable (void)
276#else
277void
278scm_init_variable ()
279#endif
280{
281 scm_tc16_variable = scm_newsmob (&variable_smob);
282 variable_sym = SCM_CAR (scm_sysintern ("anonymous-variable", SCM_UNDEFINED));
283#include "variable.x"
284}
285