28f66037938ed0e53fbc0d1a52c6aeddb9090e34
[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
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
28 #include "libguile/__scm.h"
29
30 #include "libguile/_scm.h"
31 #include "libguile/alist.h"
32 #include "libguile/async.h"
33 #include "libguile/continuations.h"
34 #include "libguile/control.h"
35 #include "libguile/debug.h"
36 #include "libguile/deprecation.h"
37 #include "libguile/dynwind.h"
38 #include "libguile/eq.h"
39 #include "libguile/expand.h"
40 #include "libguile/feature.h"
41 #include "libguile/fluids.h"
42 #include "libguile/goops.h"
43 #include "libguile/hash.h"
44 #include "libguile/hashtab.h"
45 #include "libguile/list.h"
46 #include "libguile/macros.h"
47 #include "libguile/memoize.h"
48 #include "libguile/modules.h"
49 #include "libguile/ports.h"
50 #include "libguile/print.h"
51 #include "libguile/procprop.h"
52 #include "libguile/programs.h"
53 #include "libguile/root.h"
54 #include "libguile/smob.h"
55 #include "libguile/srcprop.h"
56 #include "libguile/stackchk.h"
57 #include "libguile/strings.h"
58 #include "libguile/threads.h"
59 #include "libguile/throw.h"
60 #include "libguile/validate.h"
61 #include "libguile/values.h"
62 #include "libguile/vectors.h"
63 #include "libguile/vm.h"
64
65 #include "libguile/eval.h"
66 #include "libguile/private-options.h"
67
68 \f
69
70
71 /* We have three levels of EVAL here:
72
73 - eval (exp, env)
74
75 evaluates EXP in environment ENV. ENV is a lexical environment
76 structure as used by the actual tree code evaluator. When ENV is
77 a top-level environment, then changes to the current module are
78 tracked by updating ENV so that it continues to be in sync with
79 the current module.
80
81 - scm_primitive_eval (exp)
82
83 evaluates EXP in the top-level environment as determined by the
84 current module. This is done by constructing a suitable
85 environment and calling eval. Thus, changes to the
86 top-level module are tracked normally.
87
88 - scm_eval (exp, mod)
89
90 evaluates EXP while MOD is the current module. This is done
91 by setting the current module to MOD_OR_STATE, invoking
92 scm_primitive_eval on EXP, and then restoring the current module
93 to the value it had previously. That is, while EXP is evaluated,
94 changes to the current module (or dynamic state) are tracked,
95 but these changes do not persist when scm_eval returns.
96
97 */
98
99
100 /* Boot closures. We only see these when compiling eval.scm, because once
101 eval.scm is in the house, closures are standard VM closures.
102 */
103
104 static scm_t_bits scm_tc16_boot_closure;
105 #define RETURN_BOOT_CLOSURE(code, env) SCM_RETURN_NEWSMOB2 (scm_tc16_boot_closure, (code), (env))
106 #define BOOT_CLOSURE_P(obj) SCM_TYP16_PREDICATE (scm_tc16_boot_closure, (obj))
107 #define BOOT_CLOSURE_CODE(x) SCM_SMOB_OBJECT (x)
108 #define BOOT_CLOSURE_ENV(x) SCM_SMOB_OBJECT_2 (x)
109 #define BOOT_CLOSURE_BODY(x) CAR (BOOT_CLOSURE_CODE (x))
110 #define BOOT_CLOSURE_NUM_REQUIRED_ARGS(x) SCM_I_INUM (CADR (BOOT_CLOSURE_CODE (x)))
111 #define BOOT_CLOSURE_IS_FIXED(x) scm_is_null (CDDR (BOOT_CLOSURE_CODE (x)))
112 /* NB: One may only call the following accessors if the closure is not FIXED. */
113 #define BOOT_CLOSURE_HAS_REST_ARGS(x) scm_is_true (CADDR (BOOT_CLOSURE_CODE (x)))
114 #define BOOT_CLOSURE_IS_REST(x) scm_is_null (CDDDR (BOOT_CLOSURE_CODE (x)))
115 /* NB: One may only call the following accessors if the closure is not REST. */
116 #define BOOT_CLOSURE_IS_FULL(x) (1)
117 #define BOOT_CLOSURE_PARSE_FULL(fu_,body,nargs,rest,nopt,kw,inits,alt) \
118 do { SCM fu = fu_; \
119 body = CAR (fu); fu = CDR (fu); \
120 \
121 rest = kw = alt = SCM_BOOL_F; \
122 inits = SCM_EOL; \
123 nopt = 0; \
124 \
125 nreq = SCM_I_INUM (CAR (fu)); fu = CDR (fu); \
126 if (scm_is_pair (fu)) \
127 { \
128 rest = CAR (fu); fu = CDR (fu); \
129 if (scm_is_pair (fu)) \
130 { \
131 nopt = SCM_I_INUM (CAR (fu)); fu = CDR (fu); \
132 kw = CAR (fu); fu = CDR (fu); \
133 inits = CAR (fu); fu = CDR (fu); \
134 alt = CAR (fu); \
135 } \
136 } \
137 } while (0)
138 static void prepare_boot_closure_env_for_apply (SCM proc, SCM args,
139 SCM *out_body, SCM *out_env);
140 static void prepare_boot_closure_env_for_eval (SCM proc, unsigned int argc,
141 SCM exps, SCM *out_body,
142 SCM *inout_env);
143
144
145 #define CAR(x) SCM_CAR(x)
146 #define CDR(x) SCM_CDR(x)
147 #define CAAR(x) SCM_CAAR(x)
148 #define CADR(x) SCM_CADR(x)
149 #define CDAR(x) SCM_CDAR(x)
150 #define CDDR(x) SCM_CDDR(x)
151 #define CADDR(x) SCM_CADDR(x)
152 #define CDDDR(x) SCM_CDDDR(x)
153
154
155 SCM_SYMBOL (scm_unbound_variable_key, "unbound-variable");
156
157 static void error_used_before_defined (void)
158 {
159 scm_error (scm_unbound_variable_key, NULL,
160 "Variable used before given a value", SCM_EOL, SCM_BOOL_F);
161 }
162
163 static void error_invalid_keyword (SCM proc)
164 {
165 scm_error_scm (scm_from_locale_symbol ("keyword-argument-error"), proc,
166 scm_from_locale_string ("Invalid keyword"), SCM_EOL,
167 SCM_BOOL_F);
168 }
169
170 static void error_unrecognized_keyword (SCM proc)
171 {
172 scm_error_scm (scm_from_locale_symbol ("keyword-argument-error"), proc,
173 scm_from_locale_string ("Unrecognized keyword"), SCM_EOL,
174 SCM_BOOL_F);
175 }
176
177
178 /* the environment:
179 (VAL ... . MOD)
180 If MOD is #f, it means the environment was captured before modules were
181 booted.
182 If MOD is the literal value '(), we are evaluating at the top level, and so
183 should track changes to the current module. You have to be careful in this
184 case, because further lexical contours should capture the current module.
185 */
186 #define CAPTURE_ENV(env) \
187 ((env == SCM_EOL) ? scm_current_module () : \
188 ((env == SCM_BOOL_F) ? scm_the_root_module () : env))
189
190 static SCM
191 eval (SCM x, SCM env)
192 {
193 SCM mx;
194 SCM proc = SCM_UNDEFINED, args = SCM_EOL;
195 unsigned int argc;
196
197 loop:
198 SCM_TICK;
199 if (!SCM_MEMOIZED_P (x))
200 abort ();
201
202 mx = SCM_MEMOIZED_ARGS (x);
203 switch (SCM_MEMOIZED_TAG (x))
204 {
205 case SCM_M_BEGIN:
206 for (; !scm_is_null (CDR (mx)); mx = CDR (mx))
207 eval (CAR (mx), env);
208 x = CAR (mx);
209 goto loop;
210
211 case SCM_M_IF:
212 if (scm_is_true (eval (CAR (mx), env)))
213 x = CADR (mx);
214 else
215 x = CDDR (mx);
216 goto loop;
217
218 case SCM_M_LET:
219 {
220 SCM inits = CAR (mx);
221 SCM new_env = CAPTURE_ENV (env);
222 for (; scm_is_pair (inits); inits = CDR (inits))
223 new_env = scm_cons (eval (CAR (inits), env), new_env);
224 env = new_env;
225 x = CDR (mx);
226 goto loop;
227 }
228
229 case SCM_M_LAMBDA:
230 RETURN_BOOT_CLOSURE (mx, CAPTURE_ENV (env));
231
232 case SCM_M_QUOTE:
233 return mx;
234
235 case SCM_M_DEFINE:
236 scm_define (CAR (mx), eval (CDR (mx), env));
237 return SCM_UNSPECIFIED;
238
239 case SCM_M_DYNWIND:
240 {
241 SCM in, out, res, old_winds;
242 in = eval (CAR (mx), env);
243 out = eval (CDDR (mx), env);
244 scm_call_0 (in);
245 old_winds = scm_i_dynwinds ();
246 scm_i_set_dynwinds (scm_acons (in, out, old_winds));
247 res = eval (CADR (mx), env);
248 scm_i_set_dynwinds (old_winds);
249 scm_call_0 (out);
250 return res;
251 }
252
253 case SCM_M_WITH_FLUIDS:
254 {
255 long i, len;
256 SCM *fluidv, *valuesv, walk, wf, res;
257 len = scm_ilength (CAR (mx));
258 fluidv = alloca (sizeof (SCM)*len);
259 for (i = 0, walk = CAR (mx); i < len; i++, walk = CDR (walk))
260 fluidv[i] = eval (CAR (walk), env);
261 valuesv = alloca (sizeof (SCM)*len);
262 for (i = 0, walk = CADR (mx); i < len; i++, walk = CDR (walk))
263 valuesv[i] = eval (CAR (walk), env);
264
265 wf = scm_i_make_with_fluids (len, fluidv, valuesv);
266 scm_i_swap_with_fluids (wf, SCM_I_CURRENT_THREAD->dynamic_state);
267 scm_i_set_dynwinds (scm_cons (wf, scm_i_dynwinds ()));
268 res = eval (CDDR (mx), env);
269 scm_i_swap_with_fluids (wf, SCM_I_CURRENT_THREAD->dynamic_state);
270 scm_i_set_dynwinds (CDR (scm_i_dynwinds ()));
271
272 return res;
273 }
274
275 case SCM_M_APPLY:
276 /* Evaluate the procedure to be applied. */
277 proc = eval (CAR (mx), env);
278 /* Evaluate the argument holding the list of arguments */
279 args = eval (CADR (mx), env);
280
281 apply_proc:
282 /* Go here to tail-apply a procedure. PROC is the procedure and
283 * ARGS is the list of arguments. */
284 if (BOOT_CLOSURE_P (proc))
285 {
286 prepare_boot_closure_env_for_apply (proc, args, &x, &env);
287 goto loop;
288 }
289 else
290 return scm_vm_apply (scm_the_vm (), proc, args);
291
292 case SCM_M_CALL:
293 /* Evaluate the procedure to be applied. */
294 proc = eval (CAR (mx), env);
295 argc = SCM_I_INUM (CADR (mx));
296 mx = CDDR (mx);
297
298 if (BOOT_CLOSURE_P (proc))
299 {
300 prepare_boot_closure_env_for_eval (proc, argc, mx, &x, &env);
301 goto loop;
302 }
303 else
304 {
305 SCM *argv;
306 unsigned int i;
307
308 argv = alloca (argc * sizeof (SCM));
309 for (i = 0; i < argc; i++, mx = CDR (mx))
310 argv[i] = eval (CAR (mx), env);
311
312 return scm_c_vm_run (scm_the_vm (), proc, argv, argc);
313 }
314
315 case SCM_M_CONT:
316 return scm_i_call_with_current_continuation (eval (mx, env));
317
318 case SCM_M_CALL_WITH_VALUES:
319 {
320 SCM producer;
321 SCM v;
322
323 producer = eval (CAR (mx), env);
324 proc = eval (CDR (mx), env); /* proc is the consumer. */
325 v = scm_vm_apply (scm_the_vm (), producer, SCM_EOL);
326 if (SCM_VALUESP (v))
327 args = scm_struct_ref (v, SCM_INUM0);
328 else
329 args = scm_list_1 (v);
330 goto apply_proc;
331 }
332
333 case SCM_M_LEXICAL_REF:
334 {
335 int n;
336 SCM ret;
337 for (n = SCM_I_INUM (mx); n; n--)
338 env = CDR (env);
339 ret = CAR (env);
340 if (SCM_UNLIKELY (SCM_UNBNDP (ret)))
341 /* we don't know what variable, though, because we don't have its
342 name */
343 error_used_before_defined ();
344 return ret;
345 }
346
347 case SCM_M_LEXICAL_SET:
348 {
349 int n;
350 SCM val = eval (CDR (mx), env);
351 for (n = SCM_I_INUM (CAR (mx)); n; n--)
352 env = CDR (env);
353 SCM_SETCAR (env, val);
354 return SCM_UNSPECIFIED;
355 }
356
357 case SCM_M_TOPLEVEL_REF:
358 if (SCM_VARIABLEP (mx))
359 return SCM_VARIABLE_REF (mx);
360 else
361 {
362 while (scm_is_pair (env))
363 env = CDR (env);
364 return SCM_VARIABLE_REF
365 (scm_memoize_variable_access_x (x, CAPTURE_ENV (env)));
366 }
367
368 case SCM_M_TOPLEVEL_SET:
369 {
370 SCM var = CAR (mx);
371 SCM val = eval (CDR (mx), env);
372 if (SCM_VARIABLEP (var))
373 {
374 SCM_VARIABLE_SET (var, val);
375 return SCM_UNSPECIFIED;
376 }
377 else
378 {
379 while (scm_is_pair (env))
380 env = CDR (env);
381 SCM_VARIABLE_SET
382 (scm_memoize_variable_access_x (x, CAPTURE_ENV (env)),
383 val);
384 return SCM_UNSPECIFIED;
385 }
386 }
387
388 case SCM_M_MODULE_REF:
389 if (SCM_VARIABLEP (mx))
390 return SCM_VARIABLE_REF (mx);
391 else
392 return SCM_VARIABLE_REF
393 (scm_memoize_variable_access_x (x, SCM_BOOL_F));
394
395 case SCM_M_MODULE_SET:
396 if (SCM_VARIABLEP (CDR (mx)))
397 {
398 SCM_VARIABLE_SET (CDR (mx), eval (CAR (mx), env));
399 return SCM_UNSPECIFIED;
400 }
401 else
402 {
403 SCM_VARIABLE_SET
404 (scm_memoize_variable_access_x (x, SCM_BOOL_F),
405 eval (CAR (mx), env));
406 return SCM_UNSPECIFIED;
407 }
408
409 case SCM_M_PROMPT:
410 {
411 SCM vm, prompt, handler, res;
412
413 vm = scm_the_vm ();
414 prompt = scm_c_make_prompt (eval (CAR (mx), env), SCM_VM_DATA (vm)->fp,
415 SCM_VM_DATA (vm)->sp, SCM_VM_DATA (vm)->ip,
416 0, -1, scm_i_dynwinds ());
417 handler = eval (CDDR (mx), env);
418 scm_i_set_dynwinds (scm_cons (prompt, scm_i_dynwinds ()));
419
420 if (SCM_PROMPT_SETJMP (prompt))
421 {
422 /* The prompt exited nonlocally. */
423 proc = handler;
424 args = scm_i_prompt_pop_abort_args_x (prompt);
425 goto apply_proc;
426 }
427
428 res = eval (CADR (mx), env);
429 scm_i_set_dynwinds (CDR (scm_i_dynwinds ()));
430 return res;
431 }
432
433 default:
434 abort ();
435 }
436 }
437
438 scm_t_option scm_debug_opts[] = {
439 { SCM_OPTION_BOOLEAN, "cheap", 1,
440 "*This option is now obsolete. Setting it has no effect." },
441 { SCM_OPTION_BOOLEAN, "breakpoints", 0,
442 "*This option is now obsolete. Setting it has no effect." },
443 { SCM_OPTION_BOOLEAN, "trace", 0,
444 "*This option is now obsolete. Setting it has no effect." },
445 { SCM_OPTION_BOOLEAN, "procnames", 1,
446 "*This option is now obsolete. Setting it has no effect." },
447 { SCM_OPTION_BOOLEAN, "backwards", 0,
448 "Display backtrace in anti-chronological order." },
449 { SCM_OPTION_INTEGER, "width", 79, "Maximal width of backtrace." },
450 { SCM_OPTION_INTEGER, "indent", 10, "Maximal indentation in backtrace." },
451 { SCM_OPTION_INTEGER, "frames", 3,
452 "Maximum number of tail-recursive frames in backtrace." },
453 { SCM_OPTION_INTEGER, "maxdepth", 1000,
454 "Maximal number of stored backtrace frames." },
455 { SCM_OPTION_INTEGER, "depth", 20, "Maximal length of printed backtrace." },
456 { SCM_OPTION_BOOLEAN, "backtrace", 0, "Show backtrace on error." },
457 { SCM_OPTION_BOOLEAN, "debug", 0, "Use the debugging evaluator." },
458 /* This default stack limit will be overridden by debug.c:init_stack_limit(),
459 if we have getrlimit() and the stack limit is not INFINITY. But it is still
460 important, as some systems have both the soft and the hard limits set to
461 INFINITY; in that case we fall back to this value.
462
463 The situation is aggravated by certain compilers, which can consume
464 "beaucoup de stack", as they say in France.
465
466 See http://thread.gmane.org/gmane.lisp.guile.devel/8599/focus=8662 for
467 more discussion. This setting is 640 KB on 32-bit arches (should be enough
468 for anyone!) or a whoppin' 1280 KB on 64-bit arches.
469 */
470 { SCM_OPTION_INTEGER, "stack", 160000, "Stack size limit (measured in words; 0 = no check)." },
471 { SCM_OPTION_SCM, "show-file-name", (unsigned long)SCM_BOOL_T,
472 "Show file names and line numbers "
473 "in backtraces when not `#f'. A value of `base' "
474 "displays only base names, while `#t' displays full names."},
475 { SCM_OPTION_BOOLEAN, "warn-deprecated", 0,
476 "Warn when deprecated features are used." },
477 { 0 },
478 };
479
480
481 /*
482 * this ordering is awkward and illogical, but we maintain it for
483 * compatibility. --hwn
484 */
485 scm_t_option scm_evaluator_trap_table[] = {
486 { SCM_OPTION_BOOLEAN, "traps", 0, "Enable evaluator traps." },
487 { SCM_OPTION_BOOLEAN, "enter-frame", 0, "Trap when eval enters new frame." },
488 { SCM_OPTION_BOOLEAN, "apply-frame", 0, "Trap when entering apply." },
489 { SCM_OPTION_BOOLEAN, "exit-frame", 0, "Trap when exiting eval or apply." },
490 { SCM_OPTION_SCM, "enter-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for enter-frame traps." },
491 { SCM_OPTION_SCM, "apply-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for apply-frame traps." },
492 { SCM_OPTION_SCM, "exit-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for exit-frame traps." },
493 { SCM_OPTION_BOOLEAN, "memoize-symbol", 0, "Trap when memoizing a symbol." },
494 { SCM_OPTION_SCM, "memoize-symbol-handler", (unsigned long)SCM_BOOL_F, "The handler for memoization." },
495 { 0 }
496 };
497
498
499 SCM_DEFINE (scm_evaluator_traps, "evaluator-traps-interface", 0, 1, 0,
500 (SCM setting),
501 "Option interface for the evaluator trap options.")
502 #define FUNC_NAME s_scm_evaluator_traps
503 {
504 SCM ans;
505
506
507 scm_options_try (setting,
508 scm_evaluator_trap_table,
509 FUNC_NAME, 1);
510 SCM_CRITICAL_SECTION_START;
511 ans = scm_options (setting,
512 scm_evaluator_trap_table,
513 FUNC_NAME);
514
515 /* njrev: same again. */
516 SCM_CRITICAL_SECTION_END;
517 return ans;
518 }
519 #undef FUNC_NAME
520
521
522
523 \f
524
525 /* Simple procedure calls
526 */
527
528 SCM
529 scm_call_0 (SCM proc)
530 {
531 return scm_c_vm_run (scm_the_vm (), proc, NULL, 0);
532 }
533
534 SCM
535 scm_call_1 (SCM proc, SCM arg1)
536 {
537 return scm_c_vm_run (scm_the_vm (), proc, &arg1, 1);
538 }
539
540 SCM
541 scm_call_2 (SCM proc, SCM arg1, SCM arg2)
542 {
543 SCM args[] = { arg1, arg2 };
544 return scm_c_vm_run (scm_the_vm (), proc, args, 2);
545 }
546
547 SCM
548 scm_call_3 (SCM proc, SCM arg1, SCM arg2, SCM arg3)
549 {
550 SCM args[] = { arg1, arg2, arg3 };
551 return scm_c_vm_run (scm_the_vm (), proc, args, 3);
552 }
553
554 SCM
555 scm_call_4 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4)
556 {
557 SCM args[] = { arg1, arg2, arg3, arg4 };
558 return scm_c_vm_run (scm_the_vm (), proc, args, 4);
559 }
560
561 SCM
562 scm_call_n (SCM proc, SCM *argv, size_t nargs)
563 {
564 return scm_c_vm_run (scm_the_vm (), proc, argv, nargs);
565 }
566
567 /* Simple procedure applies
568 */
569
570 SCM
571 scm_apply_0 (SCM proc, SCM args)
572 {
573 return scm_apply (proc, args, SCM_EOL);
574 }
575
576 SCM
577 scm_apply_1 (SCM proc, SCM arg1, SCM args)
578 {
579 return scm_apply (proc, scm_cons (arg1, args), SCM_EOL);
580 }
581
582 SCM
583 scm_apply_2 (SCM proc, SCM arg1, SCM arg2, SCM args)
584 {
585 return scm_apply (proc, scm_cons2 (arg1, arg2, args), SCM_EOL);
586 }
587
588 SCM
589 scm_apply_3 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM args)
590 {
591 return scm_apply (proc, scm_cons (arg1, scm_cons2 (arg2, arg3, args)),
592 SCM_EOL);
593 }
594
595 /* This code processes the arguments to apply:
596
597 (apply PROC ARG1 ... ARGS)
598
599 Given a list (ARG1 ... ARGS), this function conses the ARG1
600 ... arguments onto the front of ARGS, and returns the resulting
601 list. Note that ARGS is a list; thus, the argument to this
602 function is a list whose last element is a list.
603
604 Apply calls this function, and applies PROC to the elements of the
605 result. apply:nconc2last takes care of building the list of
606 arguments, given (ARG1 ... ARGS).
607
608 Rather than do new consing, apply:nconc2last destroys its argument.
609 On that topic, this code came into my care with the following
610 beautifully cryptic comment on that topic: "This will only screw
611 you if you do (scm_apply scm_apply '( ... ))" If you know what
612 they're referring to, send me a patch to this comment. */
613
614 SCM_DEFINE (scm_nconc2last, "apply:nconc2last", 1, 0, 0,
615 (SCM lst),
616 "Given a list (@var{arg1} @dots{} @var{args}), this function\n"
617 "conses the @var{arg1} @dots{} arguments onto the front of\n"
618 "@var{args}, and returns the resulting list. Note that\n"
619 "@var{args} is a list; thus, the argument to this function is\n"
620 "a list whose last element is a list.\n"
621 "Note: Rather than do new consing, @code{apply:nconc2last}\n"
622 "destroys its argument, so use with care.")
623 #define FUNC_NAME s_scm_nconc2last
624 {
625 SCM *lloc;
626 SCM_VALIDATE_NONEMPTYLIST (1, lst);
627 lloc = &lst;
628 while (!scm_is_null (SCM_CDR (*lloc))) /* Perhaps should be
629 SCM_NULL_OR_NIL_P, but not
630 needed in 99.99% of cases,
631 and it could seriously hurt
632 performance. - Neil */
633 lloc = SCM_CDRLOC (*lloc);
634 SCM_ASSERT (scm_ilength (SCM_CAR (*lloc)) >= 0, lst, SCM_ARG1, FUNC_NAME);
635 *lloc = SCM_CAR (*lloc);
636 return lst;
637 }
638 #undef FUNC_NAME
639
640
641
642 /* Typechecking for multi-argument MAP and FOR-EACH.
643
644 Verify that each element of the vector ARGV, except for the first,
645 is a proper list whose length is LEN. Attribute errors to WHO,
646 and claim that the i'th element of ARGV is WHO's i+2'th argument. */
647 static inline void
648 check_map_args (SCM argv,
649 long len,
650 SCM gf,
651 SCM proc,
652 SCM args,
653 const char *who)
654 {
655 long i;
656
657 for (i = SCM_SIMPLE_VECTOR_LENGTH (argv) - 1; i >= 1; i--)
658 {
659 SCM elt = SCM_SIMPLE_VECTOR_REF (argv, i);
660 long elt_len = scm_ilength (elt);
661
662 if (elt_len < 0)
663 {
664 if (gf)
665 scm_apply_generic (gf, scm_cons (proc, args));
666 else
667 scm_wrong_type_arg (who, i + 2, elt);
668 }
669
670 if (elt_len != len)
671 scm_out_of_range_pos (who, elt, scm_from_long (i + 2));
672 }
673 }
674
675
676 SCM_GPROC (s_map, "map", 2, 0, 1, scm_map, g_map);
677
678 /* Note: Currently, scm_map applies PROC to the argument list(s)
679 sequentially, starting with the first element(s). This is used in
680 evalext.c where the Scheme procedure `map-in-order', which guarantees
681 sequential behaviour, is implemented using scm_map. If the
682 behaviour changes, we need to update `map-in-order'.
683 */
684
685 SCM
686 scm_map (SCM proc, SCM arg1, SCM args)
687 #define FUNC_NAME s_map
688 {
689 long i, len;
690 SCM res = SCM_EOL;
691 SCM *pres = &res;
692
693 len = scm_ilength (arg1);
694 SCM_GASSERTn (len >= 0,
695 g_map, scm_cons2 (proc, arg1, args), SCM_ARG2, s_map);
696 SCM_VALIDATE_REST_ARGUMENT (args);
697 if (scm_is_null (args))
698 {
699 SCM_GASSERT2 (scm_is_true (scm_procedure_p (proc)), g_map, proc, arg1, SCM_ARG1, s_map);
700 while (SCM_NIMP (arg1))
701 {
702 *pres = scm_list_1 (scm_call_1 (proc, SCM_CAR (arg1)));
703 pres = SCM_CDRLOC (*pres);
704 arg1 = SCM_CDR (arg1);
705 }
706 return res;
707 }
708 if (scm_is_null (SCM_CDR (args)))
709 {
710 SCM arg2 = SCM_CAR (args);
711 int len2 = scm_ilength (arg2);
712 SCM_GASSERTn (scm_is_true (scm_procedure_p (proc)), g_map,
713 scm_cons2 (proc, arg1, args), SCM_ARG1, s_map);
714 SCM_GASSERTn (len2 >= 0,
715 g_map, scm_cons2 (proc, arg1, args), SCM_ARG3, s_map);
716 if (len2 != len)
717 SCM_OUT_OF_RANGE (3, arg2);
718 while (SCM_NIMP (arg1))
719 {
720 *pres = scm_list_1 (scm_call_2 (proc, SCM_CAR (arg1), SCM_CAR (arg2)));
721 pres = SCM_CDRLOC (*pres);
722 arg1 = SCM_CDR (arg1);
723 arg2 = SCM_CDR (arg2);
724 }
725 return res;
726 }
727 arg1 = scm_cons (arg1, args);
728 args = scm_vector (arg1);
729 check_map_args (args, len, g_map, proc, arg1, s_map);
730 while (1)
731 {
732 arg1 = SCM_EOL;
733 for (i = SCM_SIMPLE_VECTOR_LENGTH (args) - 1; i >= 0; i--)
734 {
735 SCM elt = SCM_SIMPLE_VECTOR_REF (args, i);
736 if (SCM_IMP (elt))
737 return res;
738 arg1 = scm_cons (SCM_CAR (elt), arg1);
739 SCM_SIMPLE_VECTOR_SET (args, i, SCM_CDR (elt));
740 }
741 *pres = scm_list_1 (scm_apply (proc, arg1, SCM_EOL));
742 pres = SCM_CDRLOC (*pres);
743 }
744 }
745 #undef FUNC_NAME
746
747
748 SCM_GPROC (s_for_each, "for-each", 2, 0, 1, scm_for_each, g_for_each);
749
750 SCM
751 scm_for_each (SCM proc, SCM arg1, SCM args)
752 #define FUNC_NAME s_for_each
753 {
754 long i, len;
755 len = scm_ilength (arg1);
756 SCM_GASSERTn (len >= 0, g_for_each, scm_cons2 (proc, arg1, args),
757 SCM_ARG2, s_for_each);
758 SCM_VALIDATE_REST_ARGUMENT (args);
759 if (scm_is_null (args))
760 {
761 SCM_GASSERT2 (scm_is_true (scm_procedure_p (proc)), g_for_each,
762 proc, arg1, SCM_ARG1, s_for_each);
763 while (SCM_NIMP (arg1))
764 {
765 scm_call_1 (proc, SCM_CAR (arg1));
766 arg1 = SCM_CDR (arg1);
767 }
768 return SCM_UNSPECIFIED;
769 }
770 if (scm_is_null (SCM_CDR (args)))
771 {
772 SCM arg2 = SCM_CAR (args);
773 int len2 = scm_ilength (arg2);
774 SCM_GASSERTn (scm_is_true (scm_procedure_p (proc)), g_for_each,
775 scm_cons2 (proc, arg1, args), SCM_ARG1, s_for_each);
776 SCM_GASSERTn (len2 >= 0, g_for_each,
777 scm_cons2 (proc, arg1, args), SCM_ARG3, s_for_each);
778 if (len2 != len)
779 SCM_OUT_OF_RANGE (3, arg2);
780 while (SCM_NIMP (arg1))
781 {
782 scm_call_2 (proc, SCM_CAR (arg1), SCM_CAR (arg2));
783 arg1 = SCM_CDR (arg1);
784 arg2 = SCM_CDR (arg2);
785 }
786 return SCM_UNSPECIFIED;
787 }
788 arg1 = scm_cons (arg1, args);
789 args = scm_vector (arg1);
790 check_map_args (args, len, g_for_each, proc, arg1, s_for_each);
791 while (1)
792 {
793 arg1 = SCM_EOL;
794 for (i = SCM_SIMPLE_VECTOR_LENGTH (args) - 1; i >= 0; i--)
795 {
796 SCM elt = SCM_SIMPLE_VECTOR_REF (args, i);
797 if (SCM_IMP (elt))
798 return SCM_UNSPECIFIED;
799 arg1 = scm_cons (SCM_CAR (elt), arg1);
800 SCM_SIMPLE_VECTOR_SET (args, i, SCM_CDR (elt));
801 }
802 scm_apply (proc, arg1, SCM_EOL);
803 }
804 }
805 #undef FUNC_NAME
806
807
808 static SCM
809 scm_c_primitive_eval (SCM exp)
810 {
811 if (!SCM_EXPANDED_P (exp))
812 exp = scm_call_1 (scm_current_module_transformer (), exp);
813 return eval (scm_memoize_expression (exp), SCM_EOL);
814 }
815
816 static SCM var_primitive_eval;
817 SCM
818 scm_primitive_eval (SCM exp)
819 {
820 return scm_c_vm_run (scm_the_vm (), scm_variable_ref (var_primitive_eval),
821 &exp, 1);
822 }
823
824
825 /* Eval does not take the second arg optionally. This is intentional
826 * in order to be R5RS compatible, and to prepare for the new module
827 * system, where we would like to make the choice of evaluation
828 * environment explicit. */
829
830 SCM_DEFINE (scm_eval, "eval", 2, 0, 0,
831 (SCM exp, SCM module_or_state),
832 "Evaluate @var{exp}, a list representing a Scheme expression,\n"
833 "in the top-level environment specified by\n"
834 "@var{module_or_state}.\n"
835 "While @var{exp} is evaluated (using @code{primitive-eval}),\n"
836 "@var{module_or_state} is made the current module when\n"
837 "it is a module, or the current dynamic state when it is\n"
838 "a dynamic state."
839 "Example: (eval '(+ 1 2) (interaction-environment))")
840 #define FUNC_NAME s_scm_eval
841 {
842 SCM res;
843
844 scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
845 if (scm_is_dynamic_state (module_or_state))
846 scm_dynwind_current_dynamic_state (module_or_state);
847 else if (scm_module_system_booted_p)
848 {
849 SCM_VALIDATE_MODULE (2, module_or_state);
850 scm_dynwind_current_module (module_or_state);
851 }
852 /* otherwise if the module system isn't booted, ignore the module arg */
853
854 res = scm_primitive_eval (exp);
855
856 scm_dynwind_end ();
857 return res;
858 }
859 #undef FUNC_NAME
860
861
862 static SCM f_apply;
863
864 /* Apply a function to a list of arguments.
865
866 This function is exported to the Scheme level as taking two
867 required arguments and a tail argument, as if it were:
868 (lambda (proc arg1 . args) ...)
869 Thus, if you just have a list of arguments to pass to a procedure,
870 pass the list as ARG1, and '() for ARGS. If you have some fixed
871 args, pass the first as ARG1, then cons any remaining fixed args
872 onto the front of your argument list, and pass that as ARGS. */
873
874 SCM
875 scm_apply (SCM proc, SCM arg1, SCM args)
876 {
877 /* Fix things up so that args contains all args. */
878 if (scm_is_null (args))
879 args = arg1;
880 else
881 args = scm_cons_star (arg1, args);
882
883 return scm_vm_apply (scm_the_vm (), proc, args);
884 }
885
886 static void
887 prepare_boot_closure_env_for_apply (SCM proc, SCM args,
888 SCM *out_body, SCM *out_env)
889 {
890 int nreq = BOOT_CLOSURE_NUM_REQUIRED_ARGS (proc);
891 SCM env = BOOT_CLOSURE_ENV (proc);
892
893 if (BOOT_CLOSURE_IS_FIXED (proc)
894 || (BOOT_CLOSURE_IS_REST (proc)
895 && !BOOT_CLOSURE_HAS_REST_ARGS (proc)))
896 {
897 if (SCM_UNLIKELY (scm_ilength (args) != nreq))
898 scm_wrong_num_args (proc);
899 for (; scm_is_pair (args); args = CDR (args))
900 env = scm_cons (CAR (args), env);
901 *out_body = BOOT_CLOSURE_BODY (proc);
902 *out_env = env;
903 }
904 else if (BOOT_CLOSURE_IS_REST (proc))
905 {
906 if (SCM_UNLIKELY (scm_ilength (args) < nreq))
907 scm_wrong_num_args (proc);
908 for (; nreq; nreq--, args = CDR (args))
909 env = scm_cons (CAR (args), env);
910 env = scm_cons (args, env);
911 *out_body = BOOT_CLOSURE_BODY (proc);
912 *out_env = env;
913 }
914 else
915 {
916 int i, argc, nreq, nopt;
917 SCM body, rest, kw, inits, alt;
918 SCM mx = BOOT_CLOSURE_CODE (proc);
919
920 loop:
921 BOOT_CLOSURE_PARSE_FULL (mx, body, nargs, rest, nopt, kw, inits, alt);
922
923 argc = scm_ilength (args);
924 if (argc < nreq)
925 {
926 if (scm_is_true (alt))
927 {
928 mx = alt;
929 goto loop;
930 }
931 else
932 scm_wrong_num_args (proc);
933 }
934 if (scm_is_false (kw) && argc > nreq + nopt && scm_is_false (rest))
935 {
936 if (scm_is_true (alt))
937 {
938 mx = alt;
939 goto loop;
940 }
941 else
942 scm_wrong_num_args (proc);
943 }
944
945 for (i = 0; i < nreq; i++, args = CDR (args))
946 env = scm_cons (CAR (args), env);
947
948 if (scm_is_false (kw))
949 {
950 /* Optional args (possibly), but no keyword args. */
951 for (; i < argc && i < nreq + nopt;
952 i++, args = CDR (args))
953 {
954 env = scm_cons (CAR (args), env);
955 inits = CDR (inits);
956 }
957
958 for (; i < nreq + nopt; i++, inits = CDR (inits))
959 env = scm_cons (eval (CAR (inits), env), env);
960
961 if (scm_is_true (rest))
962 env = scm_cons (args, env);
963 }
964 else
965 {
966 SCM aok;
967
968 aok = CAR (kw);
969 kw = CDR (kw);
970
971 /* Keyword args. As before, but stop at the first keyword. */
972 for (; i < argc && i < nreq + nopt && !scm_is_keyword (CAR (args));
973 i++, args = CDR (args), inits = CDR (inits))
974 env = scm_cons (CAR (args), env);
975
976 for (; i < nreq + nopt; i++, inits = CDR (inits))
977 env = scm_cons (eval (CAR (inits), env), env);
978
979 if (scm_is_true (rest))
980 {
981 env = scm_cons (args, env);
982 i++;
983 }
984
985 /* Now fill in env with unbound values, limn the rest of the args for
986 keywords, and fill in unbound values with their inits. */
987 {
988 int imax = i - 1;
989 int kw_start_idx = i;
990 SCM walk, k, v;
991 for (walk = kw; scm_is_pair (walk); walk = CDR (walk))
992 if (SCM_I_INUM (CDAR (walk)) > imax)
993 imax = SCM_I_INUM (CDAR (walk));
994 for (; i <= imax; i++)
995 env = scm_cons (SCM_UNDEFINED, env);
996
997 if (scm_is_pair (args) && scm_is_pair (CDR (args)))
998 for (; scm_is_pair (args) && scm_is_pair (CDR (args));
999 args = CDR (args))
1000 {
1001 k = CAR (args); v = CADR (args);
1002 if (!scm_is_keyword (k))
1003 {
1004 if (scm_is_true (rest))
1005 continue;
1006 else
1007 break;
1008 }
1009 for (walk = kw; scm_is_pair (walk); walk = CDR (walk))
1010 if (scm_is_eq (k, CAAR (walk)))
1011 {
1012 /* Well... ok, list-set! isn't the nicest interface, but
1013 hey. */
1014 int iset = imax - SCM_I_INUM (CDAR (walk));
1015 scm_list_set_x (env, SCM_I_MAKINUM (iset), v);
1016 args = CDR (args);
1017 break;
1018 }
1019 if (scm_is_null (walk) && scm_is_false (aok))
1020 error_unrecognized_keyword (proc);
1021 }
1022 if (scm_is_pair (args) && scm_is_false (rest))
1023 error_invalid_keyword (proc);
1024
1025 /* Now fill in unbound values, evaluating init expressions in their
1026 appropriate environment. */
1027 for (i = imax - kw_start_idx; scm_is_pair (inits); i--, inits = CDR (inits))
1028 {
1029 SCM tail = scm_list_tail (env, SCM_I_MAKINUM (i));
1030 if (SCM_UNBNDP (CAR (tail)))
1031 SCM_SETCAR (tail, eval (CAR (inits), CDR (tail)));
1032 }
1033 }
1034 }
1035
1036 *out_body = body;
1037 *out_env = env;
1038 }
1039 }
1040
1041 static void
1042 prepare_boot_closure_env_for_eval (SCM proc, unsigned int argc,
1043 SCM exps, SCM *out_body, SCM *inout_env)
1044 {
1045 int nreq = BOOT_CLOSURE_NUM_REQUIRED_ARGS (proc);
1046 SCM new_env = BOOT_CLOSURE_ENV (proc);
1047 if (BOOT_CLOSURE_IS_FIXED (proc)
1048 || (BOOT_CLOSURE_IS_REST (proc)
1049 && !BOOT_CLOSURE_HAS_REST_ARGS (proc)))
1050 {
1051 for (; scm_is_pair (exps); exps = CDR (exps), nreq--)
1052 new_env = scm_cons (eval (CAR (exps), *inout_env), new_env);
1053 if (SCM_UNLIKELY (nreq != 0))
1054 scm_wrong_num_args (proc);
1055 *out_body = BOOT_CLOSURE_BODY (proc);
1056 *inout_env = new_env;
1057 }
1058 else if (BOOT_CLOSURE_IS_REST (proc))
1059 {
1060 if (SCM_UNLIKELY (argc < nreq))
1061 scm_wrong_num_args (proc);
1062 for (; nreq; nreq--, exps = CDR (exps))
1063 new_env = scm_cons (eval (CAR (exps), *inout_env), new_env);
1064 {
1065 SCM rest = SCM_EOL;
1066 for (; scm_is_pair (exps); exps = CDR (exps))
1067 rest = scm_cons (eval (CAR (exps), *inout_env), rest);
1068 new_env = scm_cons (scm_reverse (rest),
1069 new_env);
1070 }
1071 *out_body = BOOT_CLOSURE_BODY (proc);
1072 *inout_env = new_env;
1073 }
1074 else
1075 {
1076 SCM args = SCM_EOL;
1077 for (; scm_is_pair (exps); exps = CDR (exps))
1078 args = scm_cons (eval (CAR (exps), *inout_env), args);
1079 args = scm_reverse_x (args, SCM_UNDEFINED);
1080 prepare_boot_closure_env_for_apply (proc, args, out_body, inout_env);
1081 }
1082 }
1083
1084 static SCM
1085 boot_closure_apply (SCM closure, SCM args)
1086 {
1087 SCM body, env;
1088 prepare_boot_closure_env_for_apply (closure, args, &body, &env);
1089 return eval (body, env);
1090 }
1091
1092 static int
1093 boot_closure_print (SCM closure, SCM port, scm_print_state *pstate)
1094 {
1095 SCM args;
1096 scm_puts ("#<boot-closure ", port);
1097 scm_uintprint ((unsigned long)SCM2PTR (closure), 16, port);
1098 scm_putc (' ', port);
1099 args = scm_make_list (scm_from_int (BOOT_CLOSURE_NUM_REQUIRED_ARGS (closure)),
1100 scm_from_locale_symbol ("_"));
1101 if (!BOOT_CLOSURE_IS_FIXED (closure) && BOOT_CLOSURE_HAS_REST_ARGS (closure))
1102 args = scm_cons_star (scm_from_locale_symbol ("_"), args);
1103 /* FIXME: optionals and rests */
1104 scm_display (args, port);
1105 scm_putc ('>', port);
1106 return 1;
1107 }
1108
1109 void
1110 scm_init_eval ()
1111 {
1112 SCM primitive_eval;
1113
1114 scm_init_opts (scm_evaluator_traps,
1115 scm_evaluator_trap_table);
1116
1117 f_apply = scm_c_define_gsubr ("apply", 2, 0, 1, scm_apply);
1118
1119 scm_tc16_boot_closure = scm_make_smob_type ("boot-closure", 0);
1120 scm_set_smob_apply (scm_tc16_boot_closure, boot_closure_apply, 0, 0, 1);
1121 scm_set_smob_print (scm_tc16_boot_closure, boot_closure_print);
1122
1123 primitive_eval = scm_c_make_gsubr ("primitive-eval", 1, 0, 0,
1124 scm_c_primitive_eval);
1125 var_primitive_eval = scm_define (SCM_SUBR_NAME (primitive_eval),
1126 primitive_eval);
1127
1128 #include "libguile/eval.x"
1129 }
1130
1131 /*
1132 Local Variables:
1133 c-file-style: "gnu"
1134 End:
1135 */
1136