REPL Server: Don't establish a SIGINT handler.
[bpt/guile.git] / libguile / eval.c
1 /* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2013
2 * Free Software Foundation, Inc.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public License
6 * as published by the Free Software Foundation; either version 3 of
7 * the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301 USA
18 */
19
20 \f
21
22 #ifdef HAVE_CONFIG_H
23 # include <config.h>
24 #endif
25
26 #include <alloca.h>
27 #include <stdarg.h>
28
29 #include "libguile/__scm.h"
30
31 #include "libguile/_scm.h"
32 #include "libguile/alist.h"
33 #include "libguile/async.h"
34 #include "libguile/continuations.h"
35 #include "libguile/control.h"
36 #include "libguile/debug.h"
37 #include "libguile/deprecation.h"
38 #include "libguile/dynwind.h"
39 #include "libguile/eq.h"
40 #include "libguile/expand.h"
41 #include "libguile/feature.h"
42 #include "libguile/fluids.h"
43 #include "libguile/goops.h"
44 #include "libguile/hash.h"
45 #include "libguile/hashtab.h"
46 #include "libguile/list.h"
47 #include "libguile/macros.h"
48 #include "libguile/memoize.h"
49 #include "libguile/modules.h"
50 #include "libguile/ports.h"
51 #include "libguile/print.h"
52 #include "libguile/procprop.h"
53 #include "libguile/programs.h"
54 #include "libguile/root.h"
55 #include "libguile/smob.h"
56 #include "libguile/srcprop.h"
57 #include "libguile/stackchk.h"
58 #include "libguile/strings.h"
59 #include "libguile/threads.h"
60 #include "libguile/throw.h"
61 #include "libguile/validate.h"
62 #include "libguile/values.h"
63 #include "libguile/vectors.h"
64 #include "libguile/vm.h"
65
66 #include "libguile/eval.h"
67 #include "libguile/private-options.h"
68
69 \f
70
71
72 /* We have three levels of EVAL here:
73
74 - eval (exp, env)
75
76 evaluates EXP in environment ENV. ENV is a lexical environment
77 structure as used by the actual tree code evaluator. When ENV is
78 a top-level environment, then changes to the current module are
79 tracked by updating ENV so that it continues to be in sync with
80 the current module.
81
82 - scm_primitive_eval (exp)
83
84 evaluates EXP in the top-level environment as determined by the
85 current module. This is done by constructing a suitable
86 environment and calling eval. Thus, changes to the
87 top-level module are tracked normally.
88
89 - scm_eval (exp, mod)
90
91 evaluates EXP while MOD is the current module. This is done
92 by setting the current module to MOD_OR_STATE, invoking
93 scm_primitive_eval on EXP, and then restoring the current module
94 to the value it had previously. That is, while EXP is evaluated,
95 changes to the current module (or dynamic state) are tracked,
96 but these changes do not persist when scm_eval returns.
97
98 */
99
100
101 /* Boot closures. We only see these when compiling eval.scm, because once
102 eval.scm is in the house, closures are standard VM closures.
103 */
104
105 static scm_t_bits scm_tc16_boot_closure;
106 #define RETURN_BOOT_CLOSURE(code, env) \
107 SCM_RETURN_NEWSMOB2 (scm_tc16_boot_closure, SCM_UNPACK (code), SCM_UNPACK (env))
108 #define BOOT_CLOSURE_P(obj) SCM_TYP16_PREDICATE (scm_tc16_boot_closure, (obj))
109 #define BOOT_CLOSURE_CODE(x) SCM_SMOB_OBJECT (x)
110 #define BOOT_CLOSURE_ENV(x) SCM_SMOB_OBJECT_2 (x)
111 #define BOOT_CLOSURE_BODY(x) CAR (BOOT_CLOSURE_CODE (x))
112 #define BOOT_CLOSURE_NUM_REQUIRED_ARGS(x) (SCM_I_INUM (CADDR (BOOT_CLOSURE_CODE (x))))
113 #define BOOT_CLOSURE_IS_FIXED(x) (scm_is_null (CDDDR (BOOT_CLOSURE_CODE (x))))
114 /* NB: One may only call the following accessors if the closure is not FIXED. */
115 #define BOOT_CLOSURE_HAS_REST_ARGS(x) scm_is_true (CADDR (SCM_CDR (BOOT_CLOSURE_CODE (x))))
116 #define BOOT_CLOSURE_IS_REST(x) scm_is_null (SCM_CDR (CDDDR (BOOT_CLOSURE_CODE (x))))
117 /* NB: One may only call the following accessors if the closure is not REST. */
118 #define BOOT_CLOSURE_IS_FULL(x) (1)
119 #define BOOT_CLOSURE_PARSE_FULL(fu_,body,nargs,rest,nopt,kw,inits,alt) \
120 do { SCM fu = fu_; \
121 body = CAR (fu); fu = CDDR (fu); \
122 \
123 rest = kw = alt = SCM_BOOL_F; \
124 inits = SCM_EOL; \
125 nopt = 0; \
126 \
127 nreq = SCM_I_INUM (CAR (fu)); fu = CDR (fu); \
128 if (scm_is_pair (fu)) \
129 { \
130 rest = CAR (fu); fu = CDR (fu); \
131 if (scm_is_pair (fu)) \
132 { \
133 nopt = SCM_I_INUM (CAR (fu)); fu = CDR (fu); \
134 kw = CAR (fu); fu = CDR (fu); \
135 inits = CAR (fu); fu = CDR (fu); \
136 alt = CAR (fu); \
137 } \
138 } \
139 } while (0)
140 static void prepare_boot_closure_env_for_apply (SCM proc, SCM args,
141 SCM *out_body, SCM *out_env);
142 static void prepare_boot_closure_env_for_eval (SCM proc, unsigned int argc,
143 SCM exps, SCM *out_body,
144 SCM *inout_env);
145
146
147 #define CAR(x) SCM_CAR(x)
148 #define CDR(x) SCM_CDR(x)
149 #define CAAR(x) SCM_CAAR(x)
150 #define CADR(x) SCM_CADR(x)
151 #define CDAR(x) SCM_CDAR(x)
152 #define CDDR(x) SCM_CDDR(x)
153 #define CADDR(x) SCM_CADDR(x)
154 #define CDDDR(x) SCM_CDDDR(x)
155
156
157 SCM_SYMBOL (scm_unbound_variable_key, "unbound-variable");
158
159 static void error_used_before_defined (void)
160 {
161 scm_error (scm_unbound_variable_key, NULL,
162 "Variable used before given a value", SCM_EOL, SCM_BOOL_F);
163 }
164
165 static void error_invalid_keyword (SCM proc, SCM obj)
166 {
167 scm_error_scm (scm_from_latin1_symbol ("keyword-argument-error"), proc,
168 scm_from_locale_string ("Invalid keyword"), SCM_EOL,
169 scm_list_1 (obj));
170 }
171
172 static void error_unrecognized_keyword (SCM proc, SCM kw)
173 {
174 scm_error_scm (scm_from_latin1_symbol ("keyword-argument-error"), proc,
175 scm_from_locale_string ("Unrecognized keyword"), SCM_EOL,
176 scm_list_1 (kw));
177 }
178
179
180 /* Multiple values truncation. */
181 static SCM
182 truncate_values (SCM x)
183 {
184 if (SCM_LIKELY (!SCM_VALUESP (x)))
185 return x;
186 else
187 {
188 SCM l = scm_struct_ref (x, SCM_INUM0);
189 if (SCM_LIKELY (scm_is_pair (l)))
190 return scm_car (l);
191 else
192 {
193 scm_ithrow (scm_from_latin1_symbol ("vm-run"),
194 scm_list_3 (scm_from_latin1_symbol ("vm-run"),
195 scm_from_locale_string
196 ("Too few values returned to continuation"),
197 SCM_EOL),
198 1);
199 /* Not reached. */
200 return SCM_BOOL_F;
201 }
202 }
203 }
204 #define EVAL1(x, env) (truncate_values (eval ((x), (env))))
205
206 /* the environment:
207 (VAL ... . MOD)
208 If MOD is #f, it means the environment was captured before modules were
209 booted.
210 If MOD is the literal value '(), we are evaluating at the top level, and so
211 should track changes to the current module. You have to be careful in this
212 case, because further lexical contours should capture the current module.
213 */
214 #define CAPTURE_ENV(env) \
215 (scm_is_null (env) ? scm_current_module () : \
216 (scm_is_false (env) ? scm_the_root_module () : env))
217
218 static SCM
219 eval (SCM x, SCM env)
220 {
221 SCM mx;
222 SCM proc = SCM_UNDEFINED, args = SCM_EOL;
223 unsigned int argc;
224
225 loop:
226 SCM_TICK;
227 if (!SCM_MEMOIZED_P (x))
228 abort ();
229
230 mx = SCM_MEMOIZED_ARGS (x);
231 switch (SCM_MEMOIZED_TAG (x))
232 {
233 case SCM_M_BEGIN:
234 for (; !scm_is_null (CDR (mx)); mx = CDR (mx))
235 eval (CAR (mx), env);
236 x = CAR (mx);
237 goto loop;
238
239 case SCM_M_IF:
240 if (scm_is_true (EVAL1 (CAR (mx), env)))
241 x = CADR (mx);
242 else
243 x = CDDR (mx);
244 goto loop;
245
246 case SCM_M_LET:
247 {
248 SCM inits = CAR (mx);
249 SCM new_env = CAPTURE_ENV (env);
250 for (; scm_is_pair (inits); inits = CDR (inits))
251 new_env = scm_cons (EVAL1 (CAR (inits), env),
252 new_env);
253 env = new_env;
254 x = CDR (mx);
255 goto loop;
256 }
257
258 case SCM_M_LAMBDA:
259 RETURN_BOOT_CLOSURE (mx, CAPTURE_ENV (env));
260
261 case SCM_M_QUOTE:
262 return mx;
263
264 case SCM_M_DEFINE:
265 scm_define (CAR (mx), EVAL1 (CDR (mx), env));
266 return SCM_UNSPECIFIED;
267
268 case SCM_M_DYNWIND:
269 {
270 SCM in, out, res, old_winds;
271 in = EVAL1 (CAR (mx), env);
272 out = EVAL1 (CDDR (mx), env);
273 scm_call_0 (in);
274 old_winds = scm_i_dynwinds ();
275 scm_i_set_dynwinds (scm_acons (in, out, old_winds));
276 res = eval (CADR (mx), env);
277 scm_i_set_dynwinds (old_winds);
278 scm_call_0 (out);
279 return res;
280 }
281
282 case SCM_M_WITH_FLUIDS:
283 {
284 long i, len;
285 SCM *fluidv, *valuesv, walk, wf, res;
286 len = scm_ilength (CAR (mx));
287 fluidv = alloca (sizeof (SCM)*len);
288 for (i = 0, walk = CAR (mx); i < len; i++, walk = CDR (walk))
289 fluidv[i] = EVAL1 (CAR (walk), env);
290 valuesv = alloca (sizeof (SCM)*len);
291 for (i = 0, walk = CADR (mx); i < len; i++, walk = CDR (walk))
292 valuesv[i] = EVAL1 (CAR (walk), env);
293
294 wf = scm_i_make_with_fluids (len, fluidv, valuesv);
295 scm_i_swap_with_fluids (wf, SCM_I_CURRENT_THREAD->dynamic_state);
296 scm_i_set_dynwinds (scm_cons (wf, scm_i_dynwinds ()));
297 res = eval (CDDR (mx), env);
298 scm_i_swap_with_fluids (wf, SCM_I_CURRENT_THREAD->dynamic_state);
299 scm_i_set_dynwinds (CDR (scm_i_dynwinds ()));
300
301 return res;
302 }
303
304 case SCM_M_APPLY:
305 /* Evaluate the procedure to be applied. */
306 proc = EVAL1 (CAR (mx), env);
307 /* Evaluate the argument holding the list of arguments */
308 args = EVAL1 (CADR (mx), env);
309
310 apply_proc:
311 /* Go here to tail-apply a procedure. PROC is the procedure and
312 * ARGS is the list of arguments. */
313 if (BOOT_CLOSURE_P (proc))
314 {
315 prepare_boot_closure_env_for_apply (proc, args, &x, &env);
316 goto loop;
317 }
318 else
319 return scm_call_with_vm (scm_the_vm (), proc, args);
320
321 case SCM_M_CALL:
322 /* Evaluate the procedure to be applied. */
323 proc = EVAL1 (CAR (mx), env);
324 argc = SCM_I_INUM (CADR (mx));
325 mx = CDDR (mx);
326
327 if (BOOT_CLOSURE_P (proc))
328 {
329 prepare_boot_closure_env_for_eval (proc, argc, mx, &x, &env);
330 goto loop;
331 }
332 else
333 {
334 SCM *argv;
335 unsigned int i;
336
337 argv = alloca (argc * sizeof (SCM));
338 for (i = 0; i < argc; i++, mx = CDR (mx))
339 argv[i] = EVAL1 (CAR (mx), env);
340
341 return scm_c_vm_run (scm_the_vm (), proc, argv, argc);
342 }
343
344 case SCM_M_CONT:
345 return scm_i_call_with_current_continuation (EVAL1 (mx, env));
346
347 case SCM_M_CALL_WITH_VALUES:
348 {
349 SCM producer;
350 SCM v;
351
352 producer = EVAL1 (CAR (mx), env);
353 /* `proc' is the consumer. */
354 proc = EVAL1 (CDR (mx), env);
355 v = scm_call_with_vm (scm_the_vm (), producer, SCM_EOL);
356 if (SCM_VALUESP (v))
357 args = scm_struct_ref (v, SCM_INUM0);
358 else
359 args = scm_list_1 (v);
360 goto apply_proc;
361 }
362
363 case SCM_M_LEXICAL_REF:
364 {
365 int n;
366 SCM ret;
367 for (n = SCM_I_INUM (mx); n; n--)
368 env = CDR (env);
369 ret = CAR (env);
370 if (SCM_UNLIKELY (SCM_UNBNDP (ret)))
371 /* we don't know what variable, though, because we don't have its
372 name */
373 error_used_before_defined ();
374 return ret;
375 }
376
377 case SCM_M_LEXICAL_SET:
378 {
379 int n;
380 SCM val = EVAL1 (CDR (mx), env);
381 for (n = SCM_I_INUM (CAR (mx)); n; n--)
382 env = CDR (env);
383 SCM_SETCAR (env, val);
384 return SCM_UNSPECIFIED;
385 }
386
387 case SCM_M_TOPLEVEL_REF:
388 if (SCM_VARIABLEP (mx))
389 return SCM_VARIABLE_REF (mx);
390 else
391 {
392 while (scm_is_pair (env))
393 env = CDR (env);
394 return SCM_VARIABLE_REF
395 (scm_memoize_variable_access_x (x, CAPTURE_ENV (env)));
396 }
397
398 case SCM_M_TOPLEVEL_SET:
399 {
400 SCM var = CAR (mx);
401 SCM val = EVAL1 (CDR (mx), env);
402 if (SCM_VARIABLEP (var))
403 {
404 SCM_VARIABLE_SET (var, val);
405 return SCM_UNSPECIFIED;
406 }
407 else
408 {
409 while (scm_is_pair (env))
410 env = CDR (env);
411 SCM_VARIABLE_SET
412 (scm_memoize_variable_access_x (x, CAPTURE_ENV (env)),
413 val);
414 return SCM_UNSPECIFIED;
415 }
416 }
417
418 case SCM_M_MODULE_REF:
419 if (SCM_VARIABLEP (mx))
420 return SCM_VARIABLE_REF (mx);
421 else
422 return SCM_VARIABLE_REF
423 (scm_memoize_variable_access_x (x, SCM_BOOL_F));
424
425 case SCM_M_MODULE_SET:
426 if (SCM_VARIABLEP (CDR (mx)))
427 {
428 SCM_VARIABLE_SET (CDR (mx), EVAL1 (CAR (mx), env));
429 return SCM_UNSPECIFIED;
430 }
431 else
432 {
433 SCM_VARIABLE_SET
434 (scm_memoize_variable_access_x (x, SCM_BOOL_F),
435 EVAL1 (CAR (mx), env));
436 return SCM_UNSPECIFIED;
437 }
438
439 case SCM_M_PROMPT:
440 {
441 SCM vm, res;
442 /* We need the prompt and handler values after a longjmp case,
443 so make sure they are volatile. */
444 volatile SCM handler, prompt;
445
446 vm = scm_the_vm ();
447 prompt = scm_c_make_prompt (EVAL1 (CAR (mx), env),
448 SCM_VM_DATA (vm)->fp,
449 SCM_VM_DATA (vm)->sp, SCM_VM_DATA (vm)->ip,
450 0, -1, scm_i_dynwinds ());
451 handler = EVAL1 (CDDR (mx), env);
452 scm_i_set_dynwinds (scm_cons (prompt, scm_i_dynwinds ()));
453
454 if (SCM_PROMPT_SETJMP (prompt))
455 {
456 /* The prompt exited nonlocally. */
457 proc = handler;
458 args = scm_i_prompt_pop_abort_args_x (scm_the_vm ());
459 goto apply_proc;
460 }
461
462 res = eval (CADR (mx), env);
463 scm_i_set_dynwinds (CDR (scm_i_dynwinds ()));
464 return res;
465 }
466
467 default:
468 abort ();
469 }
470 }
471
472 \f
473
474 /* Simple procedure calls
475 */
476
477 SCM
478 scm_call_0 (SCM proc)
479 {
480 return scm_c_vm_run (scm_the_vm (), proc, NULL, 0);
481 }
482
483 SCM
484 scm_call_1 (SCM proc, SCM arg1)
485 {
486 return scm_c_vm_run (scm_the_vm (), proc, &arg1, 1);
487 }
488
489 SCM
490 scm_call_2 (SCM proc, SCM arg1, SCM arg2)
491 {
492 SCM args[] = { arg1, arg2 };
493 return scm_c_vm_run (scm_the_vm (), proc, args, 2);
494 }
495
496 SCM
497 scm_call_3 (SCM proc, SCM arg1, SCM arg2, SCM arg3)
498 {
499 SCM args[] = { arg1, arg2, arg3 };
500 return scm_c_vm_run (scm_the_vm (), proc, args, 3);
501 }
502
503 SCM
504 scm_call_4 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4)
505 {
506 SCM args[] = { arg1, arg2, arg3, arg4 };
507 return scm_c_vm_run (scm_the_vm (), proc, args, 4);
508 }
509
510 SCM
511 scm_call_5 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5)
512 {
513 SCM args[] = { arg1, arg2, arg3, arg4, arg5 };
514 return scm_c_vm_run (scm_the_vm (), proc, args, 5);
515 }
516
517 SCM
518 scm_call_6 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5,
519 SCM arg6)
520 {
521 SCM args[] = { arg1, arg2, arg3, arg4, arg5, arg6 };
522 return scm_c_vm_run (scm_the_vm (), proc, args, 6);
523 }
524
525 SCM
526 scm_call_7 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5,
527 SCM arg6, SCM arg7)
528 {
529 SCM args[] = { arg1, arg2, arg3, arg4, arg5, arg6, arg7 };
530 return scm_c_vm_run (scm_the_vm (), proc, args, 7);
531 }
532
533 SCM
534 scm_call_8 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5,
535 SCM arg6, SCM arg7, SCM arg8)
536 {
537 SCM args[] = { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 };
538 return scm_c_vm_run (scm_the_vm (), proc, args, 8);
539 }
540
541 SCM
542 scm_call_9 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5,
543 SCM arg6, SCM arg7, SCM arg8, SCM arg9)
544 {
545 SCM args[] = { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 };
546 return scm_c_vm_run (scm_the_vm (), proc, args, 9);
547 }
548
549 SCM
550 scm_call_n (SCM proc, SCM *argv, size_t nargs)
551 {
552 return scm_c_vm_run (scm_the_vm (), proc, argv, nargs);
553 }
554
555 SCM
556 scm_call (SCM proc, ...)
557 {
558 va_list argp;
559 SCM *argv = NULL;
560 size_t i, nargs = 0;
561
562 va_start (argp, proc);
563 while (!SCM_UNBNDP (va_arg (argp, SCM)))
564 nargs++;
565 va_end (argp);
566
567 argv = alloca (nargs * sizeof (SCM));
568 va_start (argp, proc);
569 for (i = 0; i < nargs; i++)
570 argv[i] = va_arg (argp, SCM);
571 va_end (argp);
572
573 return scm_c_vm_run (scm_the_vm (), proc, argv, nargs);
574 }
575
576 /* Simple procedure applies
577 */
578
579 SCM
580 scm_apply_0 (SCM proc, SCM args)
581 {
582 return scm_apply (proc, args, SCM_EOL);
583 }
584
585 SCM
586 scm_apply_1 (SCM proc, SCM arg1, SCM args)
587 {
588 return scm_apply (proc, scm_cons (arg1, args), SCM_EOL);
589 }
590
591 SCM
592 scm_apply_2 (SCM proc, SCM arg1, SCM arg2, SCM args)
593 {
594 return scm_apply (proc, scm_cons2 (arg1, arg2, args), SCM_EOL);
595 }
596
597 SCM
598 scm_apply_3 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM args)
599 {
600 return scm_apply (proc, scm_cons (arg1, scm_cons2 (arg2, arg3, args)),
601 SCM_EOL);
602 }
603
604 /* This code processes the arguments to apply:
605
606 (apply PROC ARG1 ... ARGS)
607
608 Given a list (ARG1 ... ARGS), this function conses the ARG1
609 ... arguments onto the front of ARGS, and returns the resulting
610 list. Note that ARGS is a list; thus, the argument to this
611 function is a list whose last element is a list.
612
613 Apply calls this function, and applies PROC to the elements of the
614 result. apply:nconc2last takes care of building the list of
615 arguments, given (ARG1 ... ARGS).
616
617 Rather than do new consing, apply:nconc2last destroys its argument.
618 On that topic, this code came into my care with the following
619 beautifully cryptic comment on that topic: "This will only screw
620 you if you do (scm_apply scm_apply '( ... ))" If you know what
621 they're referring to, send me a patch to this comment. */
622
623 SCM_DEFINE (scm_nconc2last, "apply:nconc2last", 1, 0, 0,
624 (SCM lst),
625 "Given a list (@var{arg1} @dots{} @var{args}), this function\n"
626 "conses the @var{arg1} @dots{} arguments onto the front of\n"
627 "@var{args}, and returns the resulting list. Note that\n"
628 "@var{args} is a list; thus, the argument to this function is\n"
629 "a list whose last element is a list.\n"
630 "Note: Rather than do new consing, @code{apply:nconc2last}\n"
631 "destroys its argument, so use with care.")
632 #define FUNC_NAME s_scm_nconc2last
633 {
634 SCM *lloc;
635 SCM_VALIDATE_NONEMPTYLIST (1, lst);
636 lloc = &lst;
637 while (!scm_is_null (SCM_CDR (*lloc)))
638 lloc = SCM_CDRLOC (*lloc);
639 SCM_ASSERT (scm_ilength (SCM_CAR (*lloc)) >= 0, lst, SCM_ARG1, FUNC_NAME);
640 *lloc = SCM_CAR (*lloc);
641 return lst;
642 }
643 #undef FUNC_NAME
644
645
646 SCM
647 scm_map (SCM proc, SCM arg1, SCM args)
648 {
649 static SCM var = SCM_BOOL_F;
650
651 if (scm_is_false (var))
652 var = scm_private_variable (scm_the_root_module (),
653 scm_from_latin1_symbol ("map"));
654
655 return scm_apply (scm_variable_ref (var),
656 scm_cons (proc, scm_cons (arg1, args)), SCM_EOL);
657 }
658
659 SCM
660 scm_for_each (SCM proc, SCM arg1, SCM args)
661 {
662 static SCM var = SCM_BOOL_F;
663
664 if (scm_is_false (var))
665 var = scm_private_variable (scm_the_root_module (),
666 scm_from_latin1_symbol ("for-each"));
667
668 return scm_apply (scm_variable_ref (var),
669 scm_cons (proc, scm_cons (arg1, args)), SCM_EOL);
670 }
671
672
673 static SCM
674 scm_c_primitive_eval (SCM exp)
675 {
676 if (!SCM_EXPANDED_P (exp))
677 exp = scm_call_1 (scm_current_module_transformer (), exp);
678 return eval (scm_memoize_expression (exp), SCM_EOL);
679 }
680
681 static SCM var_primitive_eval;
682 SCM
683 scm_primitive_eval (SCM exp)
684 {
685 return scm_c_vm_run (scm_the_vm (), scm_variable_ref (var_primitive_eval),
686 &exp, 1);
687 }
688
689
690 /* Eval does not take the second arg optionally. This is intentional
691 * in order to be R5RS compatible, and to prepare for the new module
692 * system, where we would like to make the choice of evaluation
693 * environment explicit. */
694
695 SCM_DEFINE (scm_eval, "eval", 2, 0, 0,
696 (SCM exp, SCM module_or_state),
697 "Evaluate @var{exp}, a list representing a Scheme expression,\n"
698 "in the top-level environment specified by\n"
699 "@var{module_or_state}.\n"
700 "While @var{exp} is evaluated (using @code{primitive-eval}),\n"
701 "@var{module_or_state} is made the current module when\n"
702 "it is a module, or the current dynamic state when it is\n"
703 "a dynamic state."
704 "Example: (eval '(+ 1 2) (interaction-environment))")
705 #define FUNC_NAME s_scm_eval
706 {
707 SCM res;
708
709 scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
710 if (scm_is_dynamic_state (module_or_state))
711 scm_dynwind_current_dynamic_state (module_or_state);
712 else if (scm_module_system_booted_p)
713 {
714 SCM_VALIDATE_MODULE (2, module_or_state);
715 scm_dynwind_current_module (module_or_state);
716 }
717 /* otherwise if the module system isn't booted, ignore the module arg */
718
719 res = scm_primitive_eval (exp);
720
721 scm_dynwind_end ();
722 return res;
723 }
724 #undef FUNC_NAME
725
726
727 static SCM f_apply;
728
729 /* Apply a function to a list of arguments.
730
731 This function is exported to the Scheme level as taking two
732 required arguments and a tail argument, as if it were:
733 (lambda (proc arg1 . args) ...)
734 Thus, if you just have a list of arguments to pass to a procedure,
735 pass the list as ARG1, and '() for ARGS. If you have some fixed
736 args, pass the first as ARG1, then cons any remaining fixed args
737 onto the front of your argument list, and pass that as ARGS. */
738
739 SCM
740 scm_apply (SCM proc, SCM arg1, SCM args)
741 {
742 /* Fix things up so that args contains all args. */
743 if (scm_is_null (args))
744 args = arg1;
745 else
746 args = scm_cons_star (arg1, args);
747
748 return scm_call_with_vm (scm_the_vm (), proc, args);
749 }
750
751 static void
752 prepare_boot_closure_env_for_apply (SCM proc, SCM args,
753 SCM *out_body, SCM *out_env)
754 {
755 int nreq = BOOT_CLOSURE_NUM_REQUIRED_ARGS (proc);
756 SCM env = BOOT_CLOSURE_ENV (proc);
757
758 if (BOOT_CLOSURE_IS_FIXED (proc)
759 || (BOOT_CLOSURE_IS_REST (proc)
760 && !BOOT_CLOSURE_HAS_REST_ARGS (proc)))
761 {
762 if (SCM_UNLIKELY (scm_ilength (args) != nreq))
763 scm_wrong_num_args (proc);
764 for (; scm_is_pair (args); args = CDR (args))
765 env = scm_cons (CAR (args), env);
766 *out_body = BOOT_CLOSURE_BODY (proc);
767 *out_env = env;
768 }
769 else if (BOOT_CLOSURE_IS_REST (proc))
770 {
771 if (SCM_UNLIKELY (scm_ilength (args) < nreq))
772 scm_wrong_num_args (proc);
773 for (; nreq; nreq--, args = CDR (args))
774 env = scm_cons (CAR (args), env);
775 env = scm_cons (args, env);
776 *out_body = BOOT_CLOSURE_BODY (proc);
777 *out_env = env;
778 }
779 else
780 {
781 int i, argc, nreq, nopt;
782 SCM body, rest, kw, inits, alt;
783 SCM mx = BOOT_CLOSURE_CODE (proc);
784
785 loop:
786 BOOT_CLOSURE_PARSE_FULL (mx, body, nargs, rest, nopt, kw, inits, alt);
787
788 argc = scm_ilength (args);
789 if (argc < nreq)
790 {
791 if (scm_is_true (alt))
792 {
793 mx = alt;
794 goto loop;
795 }
796 else
797 scm_wrong_num_args (proc);
798 }
799 if (scm_is_false (kw) && argc > nreq + nopt && scm_is_false (rest))
800 {
801 if (scm_is_true (alt))
802 {
803 mx = alt;
804 goto loop;
805 }
806 else
807 scm_wrong_num_args (proc);
808 }
809
810 for (i = 0; i < nreq; i++, args = CDR (args))
811 env = scm_cons (CAR (args), env);
812
813 if (scm_is_false (kw))
814 {
815 /* Optional args (possibly), but no keyword args. */
816 for (; i < argc && i < nreq + nopt;
817 i++, args = CDR (args))
818 {
819 env = scm_cons (CAR (args), env);
820 inits = CDR (inits);
821 }
822
823 for (; i < nreq + nopt; i++, inits = CDR (inits))
824 env = scm_cons (EVAL1 (CAR (inits), env), env);
825
826 if (scm_is_true (rest))
827 env = scm_cons (args, env);
828 }
829 else
830 {
831 SCM aok;
832
833 aok = CAR (kw);
834 kw = CDR (kw);
835
836 /* Keyword args. As before, but stop at the first keyword. */
837 for (; i < argc && i < nreq + nopt && !scm_is_keyword (CAR (args));
838 i++, args = CDR (args), inits = CDR (inits))
839 env = scm_cons (CAR (args), env);
840
841 for (; i < nreq + nopt; i++, inits = CDR (inits))
842 env = scm_cons (EVAL1 (CAR (inits), env), env);
843
844 if (scm_is_true (rest))
845 {
846 env = scm_cons (args, env);
847 i++;
848 }
849 else if (scm_is_true (alt)
850 && scm_is_pair (args) && !scm_is_keyword (CAR (args)))
851 {
852 /* Too many positional args, no rest arg, and we have an
853 alternate clause. */
854 mx = alt;
855 goto loop;
856 }
857
858 /* Now fill in env with unbound values, limn the rest of the args for
859 keywords, and fill in unbound values with their inits. */
860 {
861 int imax = i - 1;
862 int kw_start_idx = i;
863 SCM walk, k, v;
864 for (walk = kw; scm_is_pair (walk); walk = CDR (walk))
865 if (SCM_I_INUM (CDAR (walk)) > imax)
866 imax = SCM_I_INUM (CDAR (walk));
867 for (; i <= imax; i++)
868 env = scm_cons (SCM_UNDEFINED, env);
869
870 if (scm_is_pair (args) && scm_is_pair (CDR (args)))
871 for (; scm_is_pair (args) && scm_is_pair (CDR (args));
872 args = CDR (args))
873 {
874 k = CAR (args); v = CADR (args);
875 if (!scm_is_keyword (k))
876 {
877 if (scm_is_true (rest))
878 continue;
879 else
880 break;
881 }
882 for (walk = kw; scm_is_pair (walk); walk = CDR (walk))
883 if (scm_is_eq (k, CAAR (walk)))
884 {
885 /* Well... ok, list-set! isn't the nicest interface, but
886 hey. */
887 int iset = imax - SCM_I_INUM (CDAR (walk));
888 scm_list_set_x (env, SCM_I_MAKINUM (iset), v);
889 args = CDR (args);
890 break;
891 }
892 if (scm_is_null (walk) && scm_is_false (aok))
893 error_unrecognized_keyword (proc, k);
894 }
895 if (scm_is_pair (args) && scm_is_false (rest))
896 error_invalid_keyword (proc, CAR (args));
897
898 /* Now fill in unbound values, evaluating init expressions in their
899 appropriate environment. */
900 for (i = imax - kw_start_idx; scm_is_pair (inits); i--, inits = CDR (inits))
901 {
902 SCM tail = scm_list_tail (env, SCM_I_MAKINUM (i));
903 if (SCM_UNBNDP (CAR (tail)))
904 SCM_SETCAR (tail, EVAL1 (CAR (inits), CDR (tail)));
905 }
906 }
907 }
908
909 *out_body = body;
910 *out_env = env;
911 }
912 }
913
914 static void
915 prepare_boot_closure_env_for_eval (SCM proc, unsigned int argc,
916 SCM exps, SCM *out_body, SCM *inout_env)
917 {
918 int nreq = BOOT_CLOSURE_NUM_REQUIRED_ARGS (proc);
919 SCM new_env = BOOT_CLOSURE_ENV (proc);
920 if (BOOT_CLOSURE_IS_FIXED (proc)
921 || (BOOT_CLOSURE_IS_REST (proc)
922 && !BOOT_CLOSURE_HAS_REST_ARGS (proc)))
923 {
924 for (; scm_is_pair (exps); exps = CDR (exps), nreq--)
925 new_env = scm_cons (EVAL1 (CAR (exps), *inout_env),
926 new_env);
927 if (SCM_UNLIKELY (nreq != 0))
928 scm_wrong_num_args (proc);
929 *out_body = BOOT_CLOSURE_BODY (proc);
930 *inout_env = new_env;
931 }
932 else if (BOOT_CLOSURE_IS_REST (proc))
933 {
934 if (SCM_UNLIKELY (argc < nreq))
935 scm_wrong_num_args (proc);
936 for (; nreq; nreq--, exps = CDR (exps))
937 new_env = scm_cons (EVAL1 (CAR (exps), *inout_env),
938 new_env);
939 {
940 SCM rest = SCM_EOL;
941 for (; scm_is_pair (exps); exps = CDR (exps))
942 rest = scm_cons (EVAL1 (CAR (exps), *inout_env), rest);
943 new_env = scm_cons (scm_reverse (rest),
944 new_env);
945 }
946 *out_body = BOOT_CLOSURE_BODY (proc);
947 *inout_env = new_env;
948 }
949 else
950 {
951 SCM args = SCM_EOL;
952 for (; scm_is_pair (exps); exps = CDR (exps))
953 args = scm_cons (EVAL1 (CAR (exps), *inout_env), args);
954 args = scm_reverse_x (args, SCM_UNDEFINED);
955 prepare_boot_closure_env_for_apply (proc, args, out_body, inout_env);
956 }
957 }
958
959 static SCM
960 boot_closure_apply (SCM closure, SCM args)
961 {
962 SCM body, env;
963 prepare_boot_closure_env_for_apply (closure, args, &body, &env);
964 return eval (body, env);
965 }
966
967 static int
968 boot_closure_print (SCM closure, SCM port, scm_print_state *pstate)
969 {
970 SCM args;
971 scm_puts ("#<boot-closure ", port);
972 scm_uintprint ((scm_t_bits)SCM2PTR (closure), 16, port);
973 scm_putc (' ', port);
974 args = scm_make_list (scm_from_int (BOOT_CLOSURE_NUM_REQUIRED_ARGS (closure)),
975 scm_from_latin1_symbol ("_"));
976 if (!BOOT_CLOSURE_IS_FIXED (closure) && BOOT_CLOSURE_HAS_REST_ARGS (closure))
977 args = scm_cons_star (scm_from_latin1_symbol ("_"), args);
978 /* FIXME: optionals and rests */
979 scm_display (args, port);
980 scm_putc ('>', port);
981 return 1;
982 }
983
984 void
985 scm_init_eval ()
986 {
987 SCM primitive_eval;
988
989 f_apply = scm_c_define_gsubr ("apply", 2, 0, 1, scm_apply);
990
991 scm_tc16_boot_closure = scm_make_smob_type ("boot-closure", 0);
992 scm_set_smob_apply (scm_tc16_boot_closure, boot_closure_apply, 0, 0, 1);
993 scm_set_smob_print (scm_tc16_boot_closure, boot_closure_print);
994
995 primitive_eval = scm_c_make_gsubr ("primitive-eval", 1, 0, 0,
996 scm_c_primitive_eval);
997 var_primitive_eval = scm_define (SCM_SUBR_NAME (primitive_eval),
998 primitive_eval);
999
1000 #include "libguile/eval.x"
1001 }
1002
1003 /*
1004 Local Variables:
1005 c-file-style: "gnu"
1006 End:
1007 */
1008