make sure we compile boot code in (guile), not (guile-user)
[bpt/guile.git] / libguile / eval.c
1 /* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009
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
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but 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 02110-1301 USA
17 */
18
19 \f
20
21 /* SECTION: This code is compiled once.
22 */
23
24 #ifdef HAVE_CONFIG_H
25 # include <config.h>
26 #endif
27
28 #include <alloca.h>
29
30 #include "libguile/__scm.h"
31
32 #include <assert.h>
33 #include "libguile/_scm.h"
34 #include "libguile/alist.h"
35 #include "libguile/async.h"
36 #include "libguile/continuations.h"
37 #include "libguile/debug.h"
38 #include "libguile/deprecation.h"
39 #include "libguile/dynwind.h"
40 #include "libguile/eq.h"
41 #include "libguile/feature.h"
42 #include "libguile/fluids.h"
43 #include "libguile/futures.h"
44 #include "libguile/goops.h"
45 #include "libguile/hash.h"
46 #include "libguile/hashtab.h"
47 #include "libguile/lang.h"
48 #include "libguile/list.h"
49 #include "libguile/macros.h"
50 #include "libguile/modules.h"
51 #include "libguile/objects.h"
52 #include "libguile/ports.h"
53 #include "libguile/print.h"
54 #include "libguile/procprop.h"
55 #include "libguile/programs.h"
56 #include "libguile/root.h"
57 #include "libguile/smob.h"
58 #include "libguile/srcprop.h"
59 #include "libguile/stackchk.h"
60 #include "libguile/strings.h"
61 #include "libguile/threads.h"
62 #include "libguile/throw.h"
63 #include "libguile/validate.h"
64 #include "libguile/values.h"
65 #include "libguile/vectors.h"
66 #include "libguile/vm.h"
67
68 #include "libguile/eval.h"
69 #include "libguile/private-options.h"
70
71 \f
72
73
74 static SCM unmemoize_exprs (SCM expr, SCM env);
75 static SCM canonicalize_define (SCM expr);
76 static SCM *scm_lookupcar1 (SCM vloc, SCM genv, int check);
77 static SCM unmemoize_builtin_macro (SCM expr, SCM env);
78 static void ceval_letrec_inits (SCM env, SCM init_forms, SCM **init_values_eol);
79 static SCM ceval (SCM x, SCM env);
80 static SCM deval (SCM x, SCM env);
81
82 \f
83
84 /* {Syntax Errors}
85 *
86 * This section defines the message strings for the syntax errors that can be
87 * detected during memoization and the functions and macros that shall be
88 * called by the memoizer code to signal syntax errors. */
89
90
91 /* Syntax errors that can be detected during memoization: */
92
93 /* Circular or improper lists do not form valid scheme expressions. If a
94 * circular list or an improper list is detected in a place where a scheme
95 * expression is expected, a 'Bad expression' error is signalled. */
96 static const char s_bad_expression[] = "Bad expression";
97
98 /* If a form is detected that holds a different number of expressions than are
99 * required in that context, a 'Missing or extra expression' error is
100 * signalled. */
101 static const char s_expression[] = "Missing or extra expression in";
102
103 /* If a form is detected that holds less expressions than are required in that
104 * context, a 'Missing expression' error is signalled. */
105 static const char s_missing_expression[] = "Missing expression in";
106
107 /* If a form is detected that holds more expressions than are allowed in that
108 * context, an 'Extra expression' error is signalled. */
109 static const char s_extra_expression[] = "Extra expression in";
110
111 /* The empty combination '()' is not allowed as an expression in scheme. If
112 * it is detected in a place where an expression is expected, an 'Illegal
113 * empty combination' error is signalled. Note: If you encounter this error
114 * message, it is very likely that you intended to denote the empty list. To
115 * do so, you need to quote the empty list like (quote ()) or '(). */
116 static const char s_empty_combination[] = "Illegal empty combination";
117
118 /* A body may hold an arbitrary number of internal defines, followed by a
119 * non-empty sequence of expressions. If a body with an empty sequence of
120 * expressions is detected, a 'Missing body expression' error is signalled.
121 */
122 static const char s_missing_body_expression[] = "Missing body expression in";
123
124 /* A body may hold an arbitrary number of internal defines, followed by a
125 * non-empty sequence of expressions. Each the definitions and the
126 * expressions may be grouped arbitraryly with begin, but it is not allowed to
127 * mix definitions and expressions. If a define form in a body mixes
128 * definitions and expressions, a 'Mixed definitions and expressions' error is
129 * signalled. */
130 static const char s_mixed_body_forms[] = "Mixed definitions and expressions in";
131 /* Definitions are only allowed on the top level and at the start of a body.
132 * If a definition is detected anywhere else, a 'Bad define placement' error
133 * is signalled. */
134 static const char s_bad_define[] = "Bad define placement";
135
136 /* Case or cond expressions must have at least one clause. If a case or cond
137 * expression without any clauses is detected, a 'Missing clauses' error is
138 * signalled. */
139 static const char s_missing_clauses[] = "Missing clauses";
140
141 /* If there is an 'else' clause in a case or a cond statement, it must be the
142 * last clause. If after the 'else' case clause further clauses are detected,
143 * a 'Misplaced else clause' error is signalled. */
144 static const char s_misplaced_else_clause[] = "Misplaced else clause";
145
146 /* If a case clause is detected that is not in the format
147 * (<label(s)> <expression1> <expression2> ...)
148 * a 'Bad case clause' error is signalled. */
149 static const char s_bad_case_clause[] = "Bad case clause";
150
151 /* If a case clause is detected where the <label(s)> element is neither a
152 * proper list nor (in case of the last clause) the syntactic keyword 'else',
153 * a 'Bad case labels' error is signalled. Note: If you encounter this error
154 * for an else-clause which seems to be syntactically correct, check if 'else'
155 * is really a syntactic keyword in that context. If 'else' is bound in the
156 * local or global environment, it is not considered a syntactic keyword, but
157 * will be treated as any other variable. */
158 static const char s_bad_case_labels[] = "Bad case labels";
159
160 /* In a case statement all labels have to be distinct. If in a case statement
161 * a label occurs more than once, a 'Duplicate case label' error is
162 * signalled. */
163 static const char s_duplicate_case_label[] = "Duplicate case label";
164
165 /* If a cond clause is detected that is not in one of the formats
166 * (<test> <expression1> ...) or (else <expression1> <expression2> ...)
167 * a 'Bad cond clause' error is signalled. */
168 static const char s_bad_cond_clause[] = "Bad cond clause";
169
170 /* If a cond clause is detected that uses the alternate '=>' form, but does
171 * not hold a recipient element for the test result, a 'Missing recipient'
172 * error is signalled. */
173 static const char s_missing_recipient[] = "Missing recipient in";
174
175 /* If in a position where a variable name is required some other object is
176 * detected, a 'Bad variable' error is signalled. */
177 static const char s_bad_variable[] = "Bad variable";
178
179 /* Bindings for forms like 'let' and 'do' have to be given in a proper,
180 * possibly empty list. If any other object is detected in a place where a
181 * list of bindings was required, a 'Bad bindings' error is signalled. */
182 static const char s_bad_bindings[] = "Bad bindings";
183
184 /* Depending on the syntactic context, a binding has to be in the format
185 * (<variable> <expression>) or (<variable> <expression1> <expression2>).
186 * If anything else is detected in a place where a binding was expected, a
187 * 'Bad binding' error is signalled. */
188 static const char s_bad_binding[] = "Bad binding";
189
190 /* Some syntactic forms don't allow variable names to appear more than once in
191 * a list of bindings. If such a situation is nevertheless detected, a
192 * 'Duplicate binding' error is signalled. */
193 static const char s_duplicate_binding[] = "Duplicate binding";
194
195 /* If the exit form of a 'do' expression is not in the format
196 * (<test> <expression> ...)
197 * a 'Bad exit clause' error is signalled. */
198 static const char s_bad_exit_clause[] = "Bad exit clause";
199
200 /* The formal function arguments of a lambda expression have to be either a
201 * single symbol or a non-cyclic list. For anything else a 'Bad formals'
202 * error is signalled. */
203 static const char s_bad_formals[] = "Bad formals";
204
205 /* If in a lambda expression something else than a symbol is detected at a
206 * place where a formal function argument is required, a 'Bad formal' error is
207 * signalled. */
208 static const char s_bad_formal[] = "Bad formal";
209
210 /* If in the arguments list of a lambda expression an argument name occurs
211 * more than once, a 'Duplicate formal' error is signalled. */
212 static const char s_duplicate_formal[] = "Duplicate formal";
213
214 /* If the evaluation of an unquote-splicing expression gives something else
215 * than a proper list, a 'Non-list result for unquote-splicing' error is
216 * signalled. */
217 static const char s_splicing[] = "Non-list result for unquote-splicing";
218
219 /* If something else than an exact integer is detected as the argument for
220 * @slot-ref and @slot-set!, a 'Bad slot number' error is signalled. */
221 static const char s_bad_slot_number[] = "Bad slot number";
222
223
224 /* Signal a syntax error. We distinguish between the form that caused the
225 * error and the enclosing expression. The error message will print out as
226 * shown in the following pattern. The file name and line number are only
227 * given when they can be determined from the erroneous form or from the
228 * enclosing expression.
229 *
230 * <filename>: In procedure memoization:
231 * <filename>: In file <name>, line <nr>: <error-message> in <expression>. */
232
233 SCM_SYMBOL (syntax_error_key, "syntax-error");
234
235 /* The prototype is needed to indicate that the function does not return. */
236 static void
237 syntax_error (const char* const, const SCM, const SCM) SCM_NORETURN;
238
239 static void
240 syntax_error (const char* const msg, const SCM form, const SCM expr)
241 {
242 SCM msg_string = scm_from_locale_string (msg);
243 SCM filename = SCM_BOOL_F;
244 SCM linenr = SCM_BOOL_F;
245 const char *format;
246 SCM args;
247
248 if (scm_is_pair (form))
249 {
250 filename = scm_source_property (form, scm_sym_filename);
251 linenr = scm_source_property (form, scm_sym_line);
252 }
253
254 if (scm_is_false (filename) && scm_is_false (linenr) && scm_is_pair (expr))
255 {
256 filename = scm_source_property (expr, scm_sym_filename);
257 linenr = scm_source_property (expr, scm_sym_line);
258 }
259
260 if (!SCM_UNBNDP (expr))
261 {
262 if (scm_is_true (filename))
263 {
264 format = "In file ~S, line ~S: ~A ~S in expression ~S.";
265 args = scm_list_5 (filename, linenr, msg_string, form, expr);
266 }
267 else if (scm_is_true (linenr))
268 {
269 format = "In line ~S: ~A ~S in expression ~S.";
270 args = scm_list_4 (linenr, msg_string, form, expr);
271 }
272 else
273 {
274 format = "~A ~S in expression ~S.";
275 args = scm_list_3 (msg_string, form, expr);
276 }
277 }
278 else
279 {
280 if (scm_is_true (filename))
281 {
282 format = "In file ~S, line ~S: ~A ~S.";
283 args = scm_list_4 (filename, linenr, msg_string, form);
284 }
285 else if (scm_is_true (linenr))
286 {
287 format = "In line ~S: ~A ~S.";
288 args = scm_list_3 (linenr, msg_string, form);
289 }
290 else
291 {
292 format = "~A ~S.";
293 args = scm_list_2 (msg_string, form);
294 }
295 }
296
297 scm_error (syntax_error_key, "memoization", format, args, SCM_BOOL_F);
298 }
299
300
301 /* Shortcut macros to simplify syntax error handling. */
302 #define ASSERT_SYNTAX(cond, message, form) \
303 { if (SCM_UNLIKELY (!(cond))) \
304 syntax_error (message, form, SCM_UNDEFINED); }
305 #define ASSERT_SYNTAX_2(cond, message, form, expr) \
306 { if (SCM_UNLIKELY (!(cond))) \
307 syntax_error (message, form, expr); }
308
309 static void error_unbound_variable (SCM symbol) SCM_NORETURN;
310 static void error_defined_variable (SCM symbol) SCM_NORETURN;
311
312 \f
313
314 /* {Ilocs}
315 *
316 * Ilocs are memoized references to variables in local environment frames.
317 * They are represented as three values: The relative offset of the
318 * environment frame, the number of the binding within that frame, and a
319 * boolean value indicating whether the binding is the last binding in the
320 * frame.
321 *
322 * Frame numbers have 11 bits, relative offsets have 12 bits.
323 */
324
325 #define SCM_ILOC00 SCM_MAKE_ITAG8(0L, scm_tc8_iloc)
326 #define SCM_IFRINC (0x00000100L)
327 #define SCM_ICDR (0x00080000L)
328 #define SCM_IDINC (0x00100000L)
329 #define SCM_IFRAME(n) ((long)((SCM_ICDR-SCM_IFRINC)>>8) \
330 & (SCM_UNPACK (n) >> 8))
331 #define SCM_IDIST(n) (SCM_UNPACK (n) >> 20)
332 #define SCM_ICDRP(n) (SCM_ICDR & SCM_UNPACK (n))
333 #define SCM_IDSTMSK (-SCM_IDINC)
334 #define SCM_IFRAMEMAX ((1<<11)-1)
335 #define SCM_IDISTMAX ((1<<12)-1)
336 #define SCM_MAKE_ILOC(frame_nr, binding_nr, last_p) \
337 SCM_PACK ( \
338 ((frame_nr) << 8) \
339 + ((binding_nr) << 20) \
340 + ((last_p) ? SCM_ICDR : 0) \
341 + scm_tc8_iloc )
342
343 void
344 scm_i_print_iloc (SCM iloc, SCM port)
345 {
346 scm_puts ("#@", port);
347 scm_intprint ((long) SCM_IFRAME (iloc), 10, port);
348 scm_putc (SCM_ICDRP (iloc) ? '-' : '+', port);
349 scm_intprint ((long) SCM_IDIST (iloc), 10, port);
350 }
351
352 #if (SCM_DEBUG_DEBUGGING_SUPPORT == 1)
353
354 SCM scm_dbg_make_iloc (SCM frame, SCM binding, SCM cdrp);
355
356 SCM_DEFINE (scm_dbg_make_iloc, "dbg-make-iloc", 3, 0, 0,
357 (SCM frame, SCM binding, SCM cdrp),
358 "Return a new iloc with frame offset @var{frame}, binding\n"
359 "offset @var{binding} and the cdr flag @var{cdrp}.")
360 #define FUNC_NAME s_scm_dbg_make_iloc
361 {
362 return SCM_MAKE_ILOC ((scm_t_bits) scm_to_unsigned_integer (frame, 0, SCM_IFRAMEMAX),
363 (scm_t_bits) scm_to_unsigned_integer (binding, 0, SCM_IDISTMAX),
364 scm_is_true (cdrp));
365 }
366 #undef FUNC_NAME
367
368 SCM scm_dbg_iloc_p (SCM obj);
369
370 SCM_DEFINE (scm_dbg_iloc_p, "dbg-iloc?", 1, 0, 0,
371 (SCM obj),
372 "Return @code{#t} if @var{obj} is an iloc.")
373 #define FUNC_NAME s_scm_dbg_iloc_p
374 {
375 return scm_from_bool (SCM_ILOCP (obj));
376 }
377 #undef FUNC_NAME
378
379 #endif
380
381 \f
382
383 /* {Evaluator byte codes (isyms)}
384 */
385
386 #define ISYMNUM(n) (SCM_ITAG8_DATA (n))
387
388 /* This table must agree with the list of SCM_IM_ constants in tags.h */
389 static const char *const isymnames[] =
390 {
391 "#@and",
392 "#@begin",
393 "#@case",
394 "#@cond",
395 "#@do",
396 "#@if",
397 "#@lambda",
398 "#@let",
399 "#@let*",
400 "#@letrec",
401 "#@or",
402 "#@quote",
403 "#@set!",
404 "#@define",
405 "#@apply",
406 "#@call-with-current-continuation",
407 "#@dispatch",
408 "#@slot-ref",
409 "#@slot-set!",
410 "#@delay",
411 "#@future",
412 "#@call-with-values",
413 "#@else",
414 "#@arrow",
415 "#@nil-cond",
416 "#@bind"
417 };
418
419 void
420 scm_i_print_isym (SCM isym, SCM port)
421 {
422 const size_t isymnum = ISYMNUM (isym);
423 if (isymnum < (sizeof isymnames / sizeof (char *)))
424 scm_puts (isymnames[isymnum], port);
425 else
426 scm_ipruk ("isym", isym, port);
427 }
428
429 \f
430
431 /* The function lookup_symbol is used during memoization: Lookup the symbol in
432 * the environment. If there is no binding for the symbol, SCM_UNDEFINED is
433 * returned. If the symbol is a global variable, the variable object to which
434 * the symbol is bound is returned. Finally, if the symbol is a local
435 * variable the corresponding iloc object is returned. */
436
437 /* A helper function for lookup_symbol: Try to find the symbol in the top
438 * level environment frame. The function returns SCM_UNDEFINED if the symbol
439 * is unbound and it returns a variable object if the symbol is a global
440 * variable. */
441 static SCM
442 lookup_global_symbol (const SCM symbol, const SCM top_level)
443 {
444 const SCM variable = scm_sym2var (symbol, top_level, SCM_BOOL_F);
445 if (scm_is_false (variable))
446 return SCM_UNDEFINED;
447 else
448 return variable;
449 }
450
451 static SCM
452 lookup_symbol (const SCM symbol, const SCM env)
453 {
454 SCM frame_idx;
455 unsigned int frame_nr;
456
457 for (frame_idx = env, frame_nr = 0;
458 !scm_is_null (frame_idx);
459 frame_idx = SCM_CDR (frame_idx), ++frame_nr)
460 {
461 const SCM frame = SCM_CAR (frame_idx);
462 if (scm_is_pair (frame))
463 {
464 /* frame holds a local environment frame */
465 SCM symbol_idx;
466 unsigned int symbol_nr;
467
468 for (symbol_idx = SCM_CAR (frame), symbol_nr = 0;
469 scm_is_pair (symbol_idx);
470 symbol_idx = SCM_CDR (symbol_idx), ++symbol_nr)
471 {
472 if (scm_is_eq (SCM_CAR (symbol_idx), symbol))
473 /* found the symbol, therefore return the iloc */
474 return SCM_MAKE_ILOC (frame_nr, symbol_nr, 0);
475 }
476 if (scm_is_eq (symbol_idx, symbol))
477 /* found the symbol as the last element of the current frame */
478 return SCM_MAKE_ILOC (frame_nr, symbol_nr, 1);
479 }
480 else
481 {
482 /* no more local environment frames */
483 return lookup_global_symbol (symbol, frame);
484 }
485 }
486
487 return lookup_global_symbol (symbol, SCM_BOOL_F);
488 }
489
490
491 /* Return true if the symbol is - from the point of view of a macro
492 * transformer - a literal in the sense specified in chapter "pattern
493 * language" of R5RS. In the code below, however, we don't match the
494 * definition of R5RS exactly: It returns true if the identifier has no
495 * binding or if it is a syntactic keyword. */
496 static int
497 literal_p (const SCM symbol, const SCM env)
498 {
499 const SCM variable = lookup_symbol (symbol, env);
500 if (SCM_UNBNDP (variable))
501 return 1;
502 if (SCM_VARIABLEP (variable) && SCM_MACROP (SCM_VARIABLE_REF (variable)))
503 return 1;
504 else
505 return 0;
506 }
507
508
509 /* Return true if the expression is self-quoting in the memoized code. Thus,
510 * some other objects (like e. g. vectors) are reported as self-quoting, which
511 * according to R5RS would need to be quoted. */
512 static int
513 is_self_quoting_p (const SCM expr)
514 {
515 if (scm_is_pair (expr))
516 return 0;
517 else if (scm_is_symbol (expr))
518 return 0;
519 else if (scm_is_null (expr))
520 return 0;
521 else return 1;
522 }
523
524
525 SCM_SYMBOL (sym_three_question_marks, "???");
526
527 static SCM
528 unmemoize_expression (const SCM expr, const SCM env)
529 {
530 if (SCM_ILOCP (expr))
531 {
532 SCM frame_idx;
533 unsigned long int frame_nr;
534 SCM symbol_idx;
535 unsigned long int symbol_nr;
536
537 for (frame_idx = env, frame_nr = SCM_IFRAME (expr);
538 frame_nr != 0;
539 frame_idx = SCM_CDR (frame_idx), --frame_nr)
540 ;
541 for (symbol_idx = SCM_CAAR (frame_idx), symbol_nr = SCM_IDIST (expr);
542 symbol_nr != 0;
543 symbol_idx = SCM_CDR (symbol_idx), --symbol_nr)
544 ;
545 return SCM_ICDRP (expr) ? symbol_idx : SCM_CAR (symbol_idx);
546 }
547 else if (SCM_VARIABLEP (expr))
548 {
549 const SCM sym = scm_module_reverse_lookup (scm_env_module (env), expr);
550 return scm_is_true (sym) ? sym : sym_three_question_marks;
551 }
552 else if (scm_is_simple_vector (expr))
553 {
554 return scm_list_2 (scm_sym_quote, expr);
555 }
556 else if (!scm_is_pair (expr))
557 {
558 return expr;
559 }
560 else if (SCM_ISYMP (SCM_CAR (expr)))
561 {
562 return unmemoize_builtin_macro (expr, env);
563 }
564 else
565 {
566 return unmemoize_exprs (expr, env);
567 }
568 }
569
570
571 static SCM
572 unmemoize_exprs (const SCM exprs, const SCM env)
573 {
574 SCM r_result = SCM_EOL;
575 SCM expr_idx = exprs;
576 SCM um_expr;
577
578 /* Note that due to the current lazy memoizer we may find partially memoized
579 * code during execution. In such code we have to expect improper lists of
580 * expressions: On the one hand, for such code syntax checks have not yet
581 * fully been performed, on the other hand, there may be even legal code
582 * like '(a . b) appear as an improper list of expressions as long as the
583 * quote expression is still in its unmemoized form. For this reason, the
584 * following code handles improper lists of expressions until memoization
585 * and execution have been completely separated. */
586 for (; scm_is_pair (expr_idx); expr_idx = SCM_CDR (expr_idx))
587 {
588 const SCM expr = SCM_CAR (expr_idx);
589
590 /* In partially memoized code, lists of expressions that stem from a
591 * body form may start with an ISYM if the body itself has not yet been
592 * memoized. This isym is just an internal marker to indicate that the
593 * body still needs to be memoized. An isym may occur at the very
594 * beginning of the body or after one or more comment strings. It is
595 * dropped during unmemoization. */
596 if (!SCM_ISYMP (expr))
597 {
598 um_expr = unmemoize_expression (expr, env);
599 r_result = scm_cons (um_expr, r_result);
600 }
601 }
602 um_expr = unmemoize_expression (expr_idx, env);
603 if (!scm_is_null (r_result))
604 {
605 const SCM result = scm_reverse_x (r_result, SCM_UNDEFINED);
606 SCM_SETCDR (r_result, um_expr);
607 return result;
608 }
609 else
610 {
611 return um_expr;
612 }
613 }
614
615
616 /* Rewrite the body (which is given as the list of expressions forming the
617 * body) into its internal form. The internal form of a body (<expr> ...) is
618 * just the body itself, but prefixed with an ISYM that denotes to what kind
619 * of outer construct this body belongs: (<ISYM> <expr> ...). A lambda body
620 * starts with SCM_IM_LAMBDA, for example, a body of a let starts with
621 * SCM_IM_LET, etc.
622 *
623 * It is assumed that the calling expression has already made sure that the
624 * body is a proper list. */
625 static SCM
626 m_body (SCM op, SCM exprs)
627 {
628 /* Don't add another ISYM if one is present already. */
629 if (SCM_ISYMP (SCM_CAR (exprs)))
630 return exprs;
631 else
632 return scm_cons (op, exprs);
633 }
634
635
636 /* The function m_expand_body memoizes a proper list of expressions forming a
637 * body. This function takes care of dealing with internal defines and
638 * transforming them into an equivalent letrec expression. The list of
639 * expressions is rewritten in place. */
640
641 /* This is a helper function for m_expand_body. If the argument expression is
642 * a symbol that denotes a syntactic keyword, the corresponding macro object
643 * is returned, in all other cases the function returns SCM_UNDEFINED. */
644 static SCM
645 try_macro_lookup (const SCM expr, const SCM env)
646 {
647 if (scm_is_symbol (expr))
648 {
649 const SCM variable = lookup_symbol (expr, env);
650 if (SCM_VARIABLEP (variable))
651 {
652 const SCM value = SCM_VARIABLE_REF (variable);
653 if (SCM_MACROP (value))
654 return value;
655 }
656 }
657
658 return SCM_UNDEFINED;
659 }
660
661 /* This is a helper function for m_expand_body. It expands user macros,
662 * because for the correct translation of a body we need to know whether they
663 * expand to a definition. */
664 static SCM
665 expand_user_macros (SCM expr, const SCM env)
666 {
667 while (scm_is_pair (expr))
668 {
669 const SCM car_expr = SCM_CAR (expr);
670 const SCM new_car = expand_user_macros (car_expr, env);
671 const SCM value = try_macro_lookup (new_car, env);
672
673 if (SCM_MACROP (value) && SCM_MACRO_TYPE (value) == 2)
674 {
675 /* User macros transform code into code. */
676 expr = scm_call_2 (SCM_MACRO_CODE (value), expr, env);
677 /* We need to reiterate on the transformed code. */
678 }
679 else
680 {
681 /* No user macro: return. */
682 SCM_SETCAR (expr, new_car);
683 return expr;
684 }
685 }
686
687 return expr;
688 }
689
690 /* This is a helper function for m_expand_body. It determines if a given form
691 * represents an application of a given built-in macro. The built-in macro to
692 * check for is identified by its syntactic keyword. The form is an
693 * application of the given macro if looking up the car of the form in the
694 * given environment actually returns the built-in macro. */
695 static int
696 is_system_macro_p (const SCM syntactic_keyword, const SCM form, const SCM env)
697 {
698 if (scm_is_pair (form))
699 {
700 const SCM car_form = SCM_CAR (form);
701 const SCM value = try_macro_lookup (car_form, env);
702 if (SCM_BUILTIN_MACRO_P (value))
703 {
704 const SCM macro_name = scm_macro_name (value);
705 return scm_is_eq (macro_name, syntactic_keyword);
706 }
707 }
708
709 return 0;
710 }
711
712 static void
713 m_expand_body (const SCM forms, const SCM env)
714 {
715 /* The first body form can be skipped since it is known to be the ISYM that
716 * was prepended to the body by m_body. */
717 SCM cdr_forms = SCM_CDR (forms);
718 SCM form_idx = cdr_forms;
719 SCM definitions = SCM_EOL;
720 SCM sequence = SCM_EOL;
721
722 /* According to R5RS, the list of body forms consists of two parts: a number
723 * (maybe zero) of definitions, followed by a non-empty sequence of
724 * expressions. Each the definitions and the expressions may be grouped
725 * arbitrarily with begin, but it is not allowed to mix definitions and
726 * expressions. The task of the following loop therefore is to split the
727 * list of body forms into the list of definitions and the sequence of
728 * expressions. */
729 while (!scm_is_null (form_idx))
730 {
731 const SCM form = SCM_CAR (form_idx);
732 const SCM new_form = expand_user_macros (form, env);
733 if (is_system_macro_p (scm_sym_define, new_form, env))
734 {
735 definitions = scm_cons (new_form, definitions);
736 form_idx = SCM_CDR (form_idx);
737 }
738 else if (is_system_macro_p (scm_sym_begin, new_form, env))
739 {
740 /* We have encountered a group of forms. This has to be either a
741 * (possibly empty) group of (possibly further grouped) definitions,
742 * or a non-empty group of (possibly further grouped)
743 * expressions. */
744 const SCM grouped_forms = SCM_CDR (new_form);
745 unsigned int found_definition = 0;
746 unsigned int found_expression = 0;
747 SCM grouped_form_idx = grouped_forms;
748 while (!found_expression && !scm_is_null (grouped_form_idx))
749 {
750 const SCM inner_form = SCM_CAR (grouped_form_idx);
751 const SCM new_inner_form = expand_user_macros (inner_form, env);
752 if (is_system_macro_p (scm_sym_define, new_inner_form, env))
753 {
754 found_definition = 1;
755 definitions = scm_cons (new_inner_form, definitions);
756 grouped_form_idx = SCM_CDR (grouped_form_idx);
757 }
758 else if (is_system_macro_p (scm_sym_begin, new_inner_form, env))
759 {
760 const SCM inner_group = SCM_CDR (new_inner_form);
761 grouped_form_idx
762 = scm_append (scm_list_2 (inner_group,
763 SCM_CDR (grouped_form_idx)));
764 }
765 else
766 {
767 /* The group marks the start of the expressions of the body.
768 * We have to make sure that within the same group we have
769 * not encountered a definition before. */
770 ASSERT_SYNTAX (!found_definition, s_mixed_body_forms, form);
771 found_expression = 1;
772 grouped_form_idx = SCM_EOL;
773 }
774 }
775
776 /* We have finished processing the group. If we have not yet
777 * encountered an expression we continue processing the forms of the
778 * body to collect further definition forms. Otherwise, the group
779 * marks the start of the sequence of expressions of the body. */
780 if (!found_expression)
781 {
782 form_idx = SCM_CDR (form_idx);
783 }
784 else
785 {
786 sequence = form_idx;
787 form_idx = SCM_EOL;
788 }
789 }
790 else
791 {
792 /* We have detected a form which is no definition. This marks the
793 * start of the sequence of expressions of the body. */
794 sequence = form_idx;
795 form_idx = SCM_EOL;
796 }
797 }
798
799 /* FIXME: forms does not hold information about the file location. */
800 ASSERT_SYNTAX (scm_is_pair (sequence), s_missing_body_expression, cdr_forms);
801
802 if (!scm_is_null (definitions))
803 {
804 SCM definition_idx;
805 SCM letrec_tail;
806 SCM letrec_expression;
807 SCM new_letrec_expression;
808
809 SCM bindings = SCM_EOL;
810 for (definition_idx = definitions;
811 !scm_is_null (definition_idx);
812 definition_idx = SCM_CDR (definition_idx))
813 {
814 const SCM definition = SCM_CAR (definition_idx);
815 const SCM canonical_definition = canonicalize_define (definition);
816 const SCM binding = SCM_CDR (canonical_definition);
817 bindings = scm_cons (binding, bindings);
818 };
819
820 letrec_tail = scm_cons (bindings, sequence);
821 /* FIXME: forms does not hold information about the file location. */
822 letrec_expression = scm_cons_source (forms, scm_sym_letrec, letrec_tail);
823 new_letrec_expression = scm_m_letrec (letrec_expression, env);
824 SCM_SETCAR (forms, new_letrec_expression);
825 SCM_SETCDR (forms, SCM_EOL);
826 }
827 else
828 {
829 SCM_SETCAR (forms, SCM_CAR (sequence));
830 SCM_SETCDR (forms, SCM_CDR (sequence));
831 }
832 }
833
834 static SCM
835 macroexp (SCM x, SCM env)
836 {
837 SCM res, proc, orig_sym;
838
839 /* Don't bother to produce error messages here. We get them when we
840 eventually execute the code for real. */
841
842 macro_tail:
843 orig_sym = SCM_CAR (x);
844 if (!scm_is_symbol (orig_sym))
845 return x;
846
847 {
848 SCM *proc_ptr = scm_lookupcar1 (x, env, 0);
849 if (proc_ptr == NULL)
850 {
851 /* We have lost the race. */
852 goto macro_tail;
853 }
854 proc = *proc_ptr;
855 }
856
857 /* Only handle memoizing macros. `Acros' and `macros' are really
858 special forms and should not be evaluated here. */
859
860 if (!SCM_MACROP (proc)
861 || (SCM_MACRO_TYPE (proc) != 2 && !SCM_BUILTIN_MACRO_P (proc)))
862 return x;
863
864 SCM_SETCAR (x, orig_sym); /* Undo memoizing effect of lookupcar */
865 res = scm_call_2 (SCM_MACRO_CODE (proc), x, env);
866
867 if (scm_ilength (res) <= 0)
868 /* Result of expansion is not a list. */
869 return (scm_list_2 (SCM_IM_BEGIN, res));
870 else
871 {
872 /* njrev: Several queries here: (1) I don't see how it can be
873 correct that the SCM_SETCAR 2 lines below this comment needs
874 protection, but the SCM_SETCAR 6 lines above does not, so
875 something here is probably wrong. (2) macroexp() is now only
876 used in one place - scm_m_generalized_set_x - whereas all other
877 macro expansion happens through expand_user_macros. Therefore
878 (2.1) perhaps macroexp() could be eliminated completely now?
879 (2.2) Does expand_user_macros need any critical section
880 protection? */
881
882 SCM_CRITICAL_SECTION_START;
883 SCM_SETCAR (x, SCM_CAR (res));
884 SCM_SETCDR (x, SCM_CDR (res));
885 SCM_CRITICAL_SECTION_END;
886
887 goto macro_tail;
888 }
889 }
890
891 /* Start of the memoizers for the standard R5RS builtin macros. */
892
893
894 SCM_SYNTAX (s_and, "and", scm_i_makbimacro, scm_m_and);
895 SCM_GLOBAL_SYMBOL (scm_sym_and, s_and);
896
897 SCM
898 scm_m_and (SCM expr, SCM env SCM_UNUSED)
899 {
900 const SCM cdr_expr = SCM_CDR (expr);
901 const long length = scm_ilength (cdr_expr);
902
903 ASSERT_SYNTAX (length >= 0, s_bad_expression, expr);
904
905 if (length == 0)
906 {
907 /* Special case: (and) is replaced by #t. */
908 return SCM_BOOL_T;
909 }
910 else
911 {
912 SCM_SETCAR (expr, SCM_IM_AND);
913 return expr;
914 }
915 }
916
917 static SCM
918 unmemoize_and (const SCM expr, const SCM env)
919 {
920 return scm_cons (scm_sym_and, unmemoize_exprs (SCM_CDR (expr), env));
921 }
922
923
924 SCM_SYNTAX (s_begin, "begin", scm_i_makbimacro, scm_m_begin);
925 SCM_GLOBAL_SYMBOL (scm_sym_begin, s_begin);
926
927 SCM
928 scm_m_begin (SCM expr, SCM env SCM_UNUSED)
929 {
930 const SCM cdr_expr = SCM_CDR (expr);
931 /* Dirk:FIXME:: An empty begin clause is not generally allowed by R5RS.
932 * That means, there should be a distinction between uses of begin where an
933 * empty clause is OK and where it is not. */
934 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
935
936 SCM_SETCAR (expr, SCM_IM_BEGIN);
937 return expr;
938 }
939
940 static SCM
941 unmemoize_begin (const SCM expr, const SCM env)
942 {
943 return scm_cons (scm_sym_begin, unmemoize_exprs (SCM_CDR (expr), env));
944 }
945
946
947 SCM_SYNTAX (s_case, "case", scm_i_makbimacro, scm_m_case);
948 SCM_GLOBAL_SYMBOL (scm_sym_case, s_case);
949 SCM_GLOBAL_SYMBOL (scm_sym_else, "else");
950
951 SCM
952 scm_m_case (SCM expr, SCM env)
953 {
954 SCM clauses;
955 SCM all_labels = SCM_EOL;
956
957 /* Check, whether 'else is a literal, i. e. not bound to a value. */
958 const int else_literal_p = literal_p (scm_sym_else, env);
959
960 const SCM cdr_expr = SCM_CDR (expr);
961 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
962 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 2, s_missing_clauses, expr);
963
964 clauses = SCM_CDR (cdr_expr);
965 while (!scm_is_null (clauses))
966 {
967 SCM labels;
968
969 const SCM clause = SCM_CAR (clauses);
970 ASSERT_SYNTAX_2 (scm_ilength (clause) >= 2,
971 s_bad_case_clause, clause, expr);
972
973 labels = SCM_CAR (clause);
974 if (scm_is_pair (labels))
975 {
976 ASSERT_SYNTAX_2 (scm_ilength (labels) >= 0,
977 s_bad_case_labels, labels, expr);
978 all_labels = scm_append (scm_list_2 (labels, all_labels));
979 }
980 else if (scm_is_null (labels))
981 {
982 /* The list of labels is empty. According to R5RS this is allowed.
983 * It means that the sequence of expressions will never be executed.
984 * Therefore, as an optimization, we could remove the whole
985 * clause. */
986 }
987 else
988 {
989 ASSERT_SYNTAX_2 (scm_is_eq (labels, scm_sym_else) && else_literal_p,
990 s_bad_case_labels, labels, expr);
991 ASSERT_SYNTAX_2 (scm_is_null (SCM_CDR (clauses)),
992 s_misplaced_else_clause, clause, expr);
993 }
994
995 /* build the new clause */
996 if (scm_is_eq (labels, scm_sym_else))
997 SCM_SETCAR (clause, SCM_IM_ELSE);
998
999 clauses = SCM_CDR (clauses);
1000 }
1001
1002 /* Check whether all case labels are distinct. */
1003 for (; !scm_is_null (all_labels); all_labels = SCM_CDR (all_labels))
1004 {
1005 const SCM label = SCM_CAR (all_labels);
1006 ASSERT_SYNTAX_2 (scm_is_false (scm_c_memq (label, SCM_CDR (all_labels))),
1007 s_duplicate_case_label, label, expr);
1008 }
1009
1010 SCM_SETCAR (expr, SCM_IM_CASE);
1011 return expr;
1012 }
1013
1014 static SCM
1015 unmemoize_case (const SCM expr, const SCM env)
1016 {
1017 const SCM um_key_expr = unmemoize_expression (SCM_CADR (expr), env);
1018 SCM um_clauses = SCM_EOL;
1019 SCM clause_idx;
1020
1021 for (clause_idx = SCM_CDDR (expr);
1022 !scm_is_null (clause_idx);
1023 clause_idx = SCM_CDR (clause_idx))
1024 {
1025 const SCM clause = SCM_CAR (clause_idx);
1026 const SCM labels = SCM_CAR (clause);
1027 const SCM exprs = SCM_CDR (clause);
1028
1029 const SCM um_exprs = unmemoize_exprs (exprs, env);
1030 const SCM um_labels = (scm_is_eq (labels, SCM_IM_ELSE))
1031 ? scm_sym_else
1032 : scm_i_finite_list_copy (labels);
1033 const SCM um_clause = scm_cons (um_labels, um_exprs);
1034
1035 um_clauses = scm_cons (um_clause, um_clauses);
1036 }
1037 um_clauses = scm_reverse_x (um_clauses, SCM_UNDEFINED);
1038
1039 return scm_cons2 (scm_sym_case, um_key_expr, um_clauses);
1040 }
1041
1042
1043 SCM_SYNTAX (s_cond, "cond", scm_i_makbimacro, scm_m_cond);
1044 SCM_GLOBAL_SYMBOL (scm_sym_cond, s_cond);
1045 SCM_GLOBAL_SYMBOL (scm_sym_arrow, "=>");
1046
1047 SCM
1048 scm_m_cond (SCM expr, SCM env)
1049 {
1050 /* Check, whether 'else or '=> is a literal, i. e. not bound to a value. */
1051 const int else_literal_p = literal_p (scm_sym_else, env);
1052 const int arrow_literal_p = literal_p (scm_sym_arrow, env);
1053
1054 const SCM clauses = SCM_CDR (expr);
1055 SCM clause_idx;
1056
1057 ASSERT_SYNTAX (scm_ilength (clauses) >= 0, s_bad_expression, expr);
1058 ASSERT_SYNTAX (scm_ilength (clauses) >= 1, s_missing_clauses, expr);
1059
1060 for (clause_idx = clauses;
1061 !scm_is_null (clause_idx);
1062 clause_idx = SCM_CDR (clause_idx))
1063 {
1064 SCM test;
1065
1066 const SCM clause = SCM_CAR (clause_idx);
1067 const long length = scm_ilength (clause);
1068 ASSERT_SYNTAX_2 (length >= 1, s_bad_cond_clause, clause, expr);
1069
1070 test = SCM_CAR (clause);
1071 if (scm_is_eq (test, scm_sym_else) && else_literal_p)
1072 {
1073 const int last_clause_p = scm_is_null (SCM_CDR (clause_idx));
1074 ASSERT_SYNTAX_2 (length >= 2,
1075 s_bad_cond_clause, clause, expr);
1076 ASSERT_SYNTAX_2 (last_clause_p,
1077 s_misplaced_else_clause, clause, expr);
1078 SCM_SETCAR (clause, SCM_IM_ELSE);
1079 }
1080 else if (length >= 2
1081 && scm_is_eq (SCM_CADR (clause), scm_sym_arrow)
1082 && arrow_literal_p)
1083 {
1084 ASSERT_SYNTAX_2 (length > 2, s_missing_recipient, clause, expr);
1085 ASSERT_SYNTAX_2 (length == 3, s_extra_expression, clause, expr);
1086 SCM_SETCAR (SCM_CDR (clause), SCM_IM_ARROW);
1087 }
1088 /* SRFI 61 extended cond */
1089 else if (length >= 3
1090 && scm_is_eq (SCM_CADDR (clause), scm_sym_arrow)
1091 && arrow_literal_p)
1092 {
1093 ASSERT_SYNTAX_2 (length > 3, s_missing_recipient, clause, expr);
1094 ASSERT_SYNTAX_2 (length == 4, s_extra_expression, clause, expr);
1095 SCM_SETCAR (SCM_CDDR (clause), SCM_IM_ARROW);
1096 }
1097 }
1098
1099 SCM_SETCAR (expr, SCM_IM_COND);
1100 return expr;
1101 }
1102
1103 static SCM
1104 unmemoize_cond (const SCM expr, const SCM env)
1105 {
1106 SCM um_clauses = SCM_EOL;
1107 SCM clause_idx;
1108
1109 for (clause_idx = SCM_CDR (expr);
1110 !scm_is_null (clause_idx);
1111 clause_idx = SCM_CDR (clause_idx))
1112 {
1113 const SCM clause = SCM_CAR (clause_idx);
1114 const SCM sequence = SCM_CDR (clause);
1115 const SCM test = SCM_CAR (clause);
1116 SCM um_test;
1117 SCM um_sequence;
1118 SCM um_clause;
1119
1120 if (scm_is_eq (test, SCM_IM_ELSE))
1121 um_test = scm_sym_else;
1122 else
1123 um_test = unmemoize_expression (test, env);
1124
1125 if (!scm_is_null (sequence) && scm_is_eq (SCM_CAR (sequence),
1126 SCM_IM_ARROW))
1127 {
1128 const SCM target = SCM_CADR (sequence);
1129 const SCM um_target = unmemoize_expression (target, env);
1130 um_sequence = scm_list_2 (scm_sym_arrow, um_target);
1131 }
1132 else
1133 {
1134 um_sequence = unmemoize_exprs (sequence, env);
1135 }
1136
1137 um_clause = scm_cons (um_test, um_sequence);
1138 um_clauses = scm_cons (um_clause, um_clauses);
1139 }
1140 um_clauses = scm_reverse_x (um_clauses, SCM_UNDEFINED);
1141
1142 return scm_cons (scm_sym_cond, um_clauses);
1143 }
1144
1145
1146 SCM_SYNTAX (s_define, "define", scm_i_makbimacro, scm_m_define);
1147 SCM_GLOBAL_SYMBOL (scm_sym_define, s_define);
1148
1149 /* Guile provides an extension to R5RS' define syntax to represent function
1150 * currying in a compact way. With this extension, it is allowed to write
1151 * (define <nested-variable> <body>), where <nested-variable> has of one of
1152 * the forms (<nested-variable> <formals>), (<nested-variable> . <formal>),
1153 * (<variable> <formals>) or (<variable> . <formal>). As in R5RS, <formals>
1154 * should be either a sequence of zero or more variables, or a sequence of one
1155 * or more variables followed by a space-delimited period and another
1156 * variable. Each level of argument nesting wraps the <body> within another
1157 * lambda expression. For example, the following forms are allowed, each one
1158 * followed by an equivalent, more explicit implementation.
1159 * Example 1:
1160 * (define ((a b . c) . d) <body>) is equivalent to
1161 * (define a (lambda (b . c) (lambda d <body>)))
1162 * Example 2:
1163 * (define (((a) b) c . d) <body>) is equivalent to
1164 * (define a (lambda () (lambda (b) (lambda (c . d) <body>))))
1165 */
1166 /* Dirk:FIXME:: We should provide an implementation for 'define' in the R5RS
1167 * module that does not implement this extension. */
1168 static SCM
1169 canonicalize_define (const SCM expr)
1170 {
1171 SCM body;
1172 SCM variable;
1173
1174 const SCM cdr_expr = SCM_CDR (expr);
1175 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
1176 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 2, s_missing_expression, expr);
1177
1178 body = SCM_CDR (cdr_expr);
1179 variable = SCM_CAR (cdr_expr);
1180 while (scm_is_pair (variable))
1181 {
1182 /* This while loop realizes function currying by variable nesting.
1183 * Variable is known to be a nested-variable. In every iteration of the
1184 * loop another level of lambda expression is created, starting with the
1185 * innermost one. Note that we don't check for duplicate formals here:
1186 * This will be done by the memoizer of the lambda expression. */
1187 const SCM formals = SCM_CDR (variable);
1188 const SCM tail = scm_cons (formals, body);
1189
1190 /* Add source properties to each new lambda expression: */
1191 const SCM lambda = scm_cons_source (variable, scm_sym_lambda, tail);
1192
1193 body = scm_list_1 (lambda);
1194 variable = SCM_CAR (variable);
1195 }
1196 ASSERT_SYNTAX_2 (scm_is_symbol (variable), s_bad_variable, variable, expr);
1197 ASSERT_SYNTAX (scm_ilength (body) == 1, s_expression, expr);
1198
1199 SCM_SETCAR (cdr_expr, variable);
1200 SCM_SETCDR (cdr_expr, body);
1201 return expr;
1202 }
1203
1204 /* According to Section 5.2.1 of R5RS we first have to make sure that the
1205 variable is bound, and then perform the `(set! variable expression)'
1206 operation. However, EXPRESSION _can_ be evaluated before VARIABLE is
1207 bound. This means that EXPRESSION won't necessarily be able to assign
1208 values to VARIABLE as in `(define foo (begin (set! foo 1) (+ foo 1)))'. */
1209 SCM
1210 scm_m_define (SCM expr, SCM env)
1211 {
1212 ASSERT_SYNTAX (SCM_TOP_LEVEL (env), s_bad_define, expr);
1213
1214 {
1215 const SCM canonical_definition = canonicalize_define (expr);
1216 const SCM cdr_canonical_definition = SCM_CDR (canonical_definition);
1217 const SCM variable = SCM_CAR (cdr_canonical_definition);
1218 const SCM value = scm_eval_car (SCM_CDR (cdr_canonical_definition), env);
1219 const SCM location
1220 = scm_sym2var (variable, scm_env_top_level (env), SCM_BOOL_T);
1221
1222 if (SCM_REC_PROCNAMES_P)
1223 {
1224 SCM tmp = value;
1225 while (SCM_MACROP (tmp))
1226 tmp = SCM_MACRO_CODE (tmp);
1227 if (scm_is_true (scm_procedure_p (tmp))
1228 /* Only the first definition determines the name. */
1229 && scm_is_false (scm_procedure_property (tmp, scm_sym_name)))
1230 scm_set_procedure_property_x (tmp, scm_sym_name, variable);
1231 }
1232
1233 SCM_VARIABLE_SET (location, value);
1234
1235 return SCM_UNSPECIFIED;
1236 }
1237 }
1238
1239
1240 /* This is a helper function for forms (<keyword> <expression>) that are
1241 * transformed into (#@<keyword> '() <memoized_expression>) in order to allow
1242 * for easy creation of a thunk (i. e. a closure without arguments) using the
1243 * ('() <memoized_expression>) tail of the memoized form. */
1244 static SCM
1245 memoize_as_thunk_prototype (const SCM expr, const SCM env SCM_UNUSED)
1246 {
1247 const SCM cdr_expr = SCM_CDR (expr);
1248 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
1249 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 1, s_expression, expr);
1250
1251 SCM_SETCDR (expr, scm_cons (SCM_EOL, cdr_expr));
1252
1253 return expr;
1254 }
1255
1256
1257 SCM_SYNTAX (s_delay, "delay", scm_i_makbimacro, scm_m_delay);
1258 SCM_GLOBAL_SYMBOL (scm_sym_delay, s_delay);
1259
1260 /* Promises are implemented as closures with an empty parameter list. Thus,
1261 * (delay <expression>) is transformed into (#@delay '() <expression>), where
1262 * the empty list represents the empty parameter list. This representation
1263 * allows for easy creation of the closure during evaluation. */
1264 SCM
1265 scm_m_delay (SCM expr, SCM env)
1266 {
1267 const SCM new_expr = memoize_as_thunk_prototype (expr, env);
1268 SCM_SETCAR (new_expr, SCM_IM_DELAY);
1269 return new_expr;
1270 }
1271
1272 static SCM
1273 unmemoize_delay (const SCM expr, const SCM env)
1274 {
1275 const SCM thunk_expr = SCM_CADDR (expr);
1276 /* A promise is implemented as a closure, and when applying a
1277 closure the evaluator adds a new frame to the environment - even
1278 though, in the case of a promise, the added frame is always
1279 empty. We need to extend the environment here in the same way,
1280 so that any ILOCs in thunk_expr can be unmemoized correctly. */
1281 const SCM new_env = SCM_EXTEND_ENV (SCM_EOL, SCM_EOL, env);
1282 return scm_list_2 (scm_sym_delay, unmemoize_expression (thunk_expr, new_env));
1283 }
1284
1285
1286 SCM_SYNTAX(s_do, "do", scm_i_makbimacro, scm_m_do);
1287 SCM_GLOBAL_SYMBOL(scm_sym_do, s_do);
1288
1289 /* DO gets the most radically altered syntax. The order of the vars is
1290 * reversed here. During the evaluation this allows for simple consing of the
1291 * results of the inits and steps:
1292
1293 (do ((<var1> <init1> <step1>)
1294 (<var2> <init2>)
1295 ... )
1296 (<test> <return>)
1297 <body>)
1298
1299 ;; becomes
1300
1301 (#@do (<init1> <init2> ... <initn>)
1302 (varn ... var2 var1)
1303 (<test> <return>)
1304 (<body>)
1305 <step1> <step2> ... <stepn>) ;; missing steps replaced by var
1306 */
1307 SCM
1308 scm_m_do (SCM expr, SCM env SCM_UNUSED)
1309 {
1310 SCM variables = SCM_EOL;
1311 SCM init_forms = SCM_EOL;
1312 SCM step_forms = SCM_EOL;
1313 SCM binding_idx;
1314 SCM cddr_expr;
1315 SCM exit_clause;
1316 SCM commands;
1317 SCM tail;
1318
1319 const SCM cdr_expr = SCM_CDR (expr);
1320 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
1321 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 2, s_missing_expression, expr);
1322
1323 /* Collect variables, init and step forms. */
1324 binding_idx = SCM_CAR (cdr_expr);
1325 ASSERT_SYNTAX_2 (scm_ilength (binding_idx) >= 0,
1326 s_bad_bindings, binding_idx, expr);
1327 for (; !scm_is_null (binding_idx); binding_idx = SCM_CDR (binding_idx))
1328 {
1329 const SCM binding = SCM_CAR (binding_idx);
1330 const long length = scm_ilength (binding);
1331 ASSERT_SYNTAX_2 (length == 2 || length == 3,
1332 s_bad_binding, binding, expr);
1333
1334 {
1335 const SCM name = SCM_CAR (binding);
1336 const SCM init = SCM_CADR (binding);
1337 const SCM step = (length == 2) ? name : SCM_CADDR (binding);
1338 ASSERT_SYNTAX_2 (scm_is_symbol (name), s_bad_variable, name, expr);
1339 ASSERT_SYNTAX_2 (scm_is_false (scm_c_memq (name, variables)),
1340 s_duplicate_binding, name, expr);
1341
1342 variables = scm_cons (name, variables);
1343 init_forms = scm_cons (init, init_forms);
1344 step_forms = scm_cons (step, step_forms);
1345 }
1346 }
1347 init_forms = scm_reverse_x (init_forms, SCM_UNDEFINED);
1348 step_forms = scm_reverse_x (step_forms, SCM_UNDEFINED);
1349
1350 /* Memoize the test form and the exit sequence. */
1351 cddr_expr = SCM_CDR (cdr_expr);
1352 exit_clause = SCM_CAR (cddr_expr);
1353 ASSERT_SYNTAX_2 (scm_ilength (exit_clause) >= 1,
1354 s_bad_exit_clause, exit_clause, expr);
1355
1356 commands = SCM_CDR (cddr_expr);
1357 tail = scm_cons2 (exit_clause, commands, step_forms);
1358 tail = scm_cons2 (init_forms, variables, tail);
1359 SCM_SETCAR (expr, SCM_IM_DO);
1360 SCM_SETCDR (expr, tail);
1361 return expr;
1362 }
1363
1364 static SCM
1365 unmemoize_do (const SCM expr, const SCM env)
1366 {
1367 const SCM cdr_expr = SCM_CDR (expr);
1368 const SCM cddr_expr = SCM_CDR (cdr_expr);
1369 const SCM rnames = SCM_CAR (cddr_expr);
1370 const SCM extended_env = SCM_EXTEND_ENV (rnames, SCM_EOL, env);
1371 const SCM cdddr_expr = SCM_CDR (cddr_expr);
1372 const SCM exit_sequence = SCM_CAR (cdddr_expr);
1373 const SCM um_exit_sequence = unmemoize_exprs (exit_sequence, extended_env);
1374 const SCM cddddr_expr = SCM_CDR (cdddr_expr);
1375 const SCM um_body = unmemoize_exprs (SCM_CAR (cddddr_expr), extended_env);
1376
1377 /* build transformed binding list */
1378 SCM um_names = scm_reverse (rnames);
1379 SCM um_inits = unmemoize_exprs (SCM_CAR (cdr_expr), env);
1380 SCM um_steps = unmemoize_exprs (SCM_CDR (cddddr_expr), extended_env);
1381 SCM um_bindings = SCM_EOL;
1382 while (!scm_is_null (um_names))
1383 {
1384 const SCM name = SCM_CAR (um_names);
1385 const SCM init = SCM_CAR (um_inits);
1386 SCM step = SCM_CAR (um_steps);
1387 step = scm_is_eq (step, name) ? SCM_EOL : scm_list_1 (step);
1388
1389 um_bindings = scm_cons (scm_cons2 (name, init, step), um_bindings);
1390
1391 um_names = SCM_CDR (um_names);
1392 um_inits = SCM_CDR (um_inits);
1393 um_steps = SCM_CDR (um_steps);
1394 }
1395 um_bindings = scm_reverse_x (um_bindings, SCM_UNDEFINED);
1396
1397 return scm_cons (scm_sym_do,
1398 scm_cons2 (um_bindings, um_exit_sequence, um_body));
1399 }
1400
1401
1402 SCM_SYNTAX (s_if, "if", scm_i_makbimacro, scm_m_if);
1403 SCM_GLOBAL_SYMBOL (scm_sym_if, s_if);
1404
1405 SCM
1406 scm_m_if (SCM expr, SCM env SCM_UNUSED)
1407 {
1408 const SCM cdr_expr = SCM_CDR (expr);
1409 const long length = scm_ilength (cdr_expr);
1410 ASSERT_SYNTAX (length == 2 || length == 3, s_expression, expr);
1411 SCM_SETCAR (expr, SCM_IM_IF);
1412 return expr;
1413 }
1414
1415 static SCM
1416 unmemoize_if (const SCM expr, const SCM env)
1417 {
1418 const SCM cdr_expr = SCM_CDR (expr);
1419 const SCM um_condition = unmemoize_expression (SCM_CAR (cdr_expr), env);
1420 const SCM cddr_expr = SCM_CDR (cdr_expr);
1421 const SCM um_then = unmemoize_expression (SCM_CAR (cddr_expr), env);
1422 const SCM cdddr_expr = SCM_CDR (cddr_expr);
1423
1424 if (scm_is_null (cdddr_expr))
1425 {
1426 return scm_list_3 (scm_sym_if, um_condition, um_then);
1427 }
1428 else
1429 {
1430 const SCM um_else = unmemoize_expression (SCM_CAR (cdddr_expr), env);
1431 return scm_list_4 (scm_sym_if, um_condition, um_then, um_else);
1432 }
1433 }
1434
1435
1436 SCM_SYNTAX (s_lambda, "lambda", scm_i_makbimacro, scm_m_lambda);
1437 SCM_GLOBAL_SYMBOL (scm_sym_lambda, s_lambda);
1438
1439 /* A helper function for memoize_lambda to support checking for duplicate
1440 * formal arguments: Return true if OBJ is `eq?' to one of the elements of
1441 * LIST or to the cdr of the last cons. Therefore, LIST may have any of the
1442 * forms that a formal argument can have:
1443 * <rest>, (<arg1> ...), (<arg1> ... . <rest>) */
1444 static int
1445 c_improper_memq (SCM obj, SCM list)
1446 {
1447 for (; scm_is_pair (list); list = SCM_CDR (list))
1448 {
1449 if (scm_is_eq (SCM_CAR (list), obj))
1450 return 1;
1451 }
1452 return scm_is_eq (list, obj);
1453 }
1454
1455 SCM
1456 scm_m_lambda (SCM expr, SCM env SCM_UNUSED)
1457 {
1458 SCM formals;
1459 SCM formals_idx;
1460 SCM cddr_expr;
1461 int documentation;
1462 SCM body;
1463 SCM new_body;
1464
1465 const SCM cdr_expr = SCM_CDR (expr);
1466 const long length = scm_ilength (cdr_expr);
1467 ASSERT_SYNTAX (length >= 0, s_bad_expression, expr);
1468 ASSERT_SYNTAX (length >= 2, s_missing_expression, expr);
1469
1470 /* Before iterating the list of formal arguments, make sure the formals
1471 * actually are given as either a symbol or a non-cyclic list. */
1472 formals = SCM_CAR (cdr_expr);
1473 if (scm_is_pair (formals))
1474 {
1475 /* Dirk:FIXME:: We should check for a cyclic list of formals, and if
1476 * detected, report a 'Bad formals' error. */
1477 }
1478 else
1479 {
1480 ASSERT_SYNTAX_2 (scm_is_symbol (formals) || scm_is_null (formals),
1481 s_bad_formals, formals, expr);
1482 }
1483
1484 /* Now iterate the list of formal arguments to check if all formals are
1485 * symbols, and that there are no duplicates. */
1486 formals_idx = formals;
1487 while (scm_is_pair (formals_idx))
1488 {
1489 const SCM formal = SCM_CAR (formals_idx);
1490 const SCM next_idx = SCM_CDR (formals_idx);
1491 ASSERT_SYNTAX_2 (scm_is_symbol (formal), s_bad_formal, formal, expr);
1492 ASSERT_SYNTAX_2 (!c_improper_memq (formal, next_idx),
1493 s_duplicate_formal, formal, expr);
1494 formals_idx = next_idx;
1495 }
1496 ASSERT_SYNTAX_2 (scm_is_null (formals_idx) || scm_is_symbol (formals_idx),
1497 s_bad_formal, formals_idx, expr);
1498
1499 /* Memoize the body. Keep a potential documentation string. */
1500 /* Dirk:FIXME:: We should probably extract the documentation string to
1501 * some external database. Otherwise it will slow down execution, since
1502 * the documentation string will have to be skipped with every execution
1503 * of the closure. */
1504 cddr_expr = SCM_CDR (cdr_expr);
1505 documentation = (length >= 3 && scm_is_string (SCM_CAR (cddr_expr)));
1506 body = documentation ? SCM_CDR (cddr_expr) : cddr_expr;
1507 new_body = m_body (SCM_IM_LAMBDA, body);
1508
1509 SCM_SETCAR (expr, SCM_IM_LAMBDA);
1510 if (documentation)
1511 SCM_SETCDR (cddr_expr, new_body);
1512 else
1513 SCM_SETCDR (cdr_expr, new_body);
1514 return expr;
1515 }
1516
1517 static SCM
1518 unmemoize_lambda (const SCM expr, const SCM env)
1519 {
1520 const SCM formals = SCM_CADR (expr);
1521 const SCM body = SCM_CDDR (expr);
1522
1523 const SCM new_env = SCM_EXTEND_ENV (formals, SCM_EOL, env);
1524 const SCM um_formals = scm_i_finite_list_copy (formals);
1525 const SCM um_body = unmemoize_exprs (body, new_env);
1526
1527 return scm_cons2 (scm_sym_lambda, um_formals, um_body);
1528 }
1529
1530
1531 /* Check if the format of the bindings is ((<symbol> <init-form>) ...). */
1532 static void
1533 check_bindings (const SCM bindings, const SCM expr)
1534 {
1535 SCM binding_idx;
1536
1537 ASSERT_SYNTAX_2 (scm_ilength (bindings) >= 0,
1538 s_bad_bindings, bindings, expr);
1539
1540 binding_idx = bindings;
1541 for (; !scm_is_null (binding_idx); binding_idx = SCM_CDR (binding_idx))
1542 {
1543 SCM name; /* const */
1544
1545 const SCM binding = SCM_CAR (binding_idx);
1546 ASSERT_SYNTAX_2 (scm_ilength (binding) == 2,
1547 s_bad_binding, binding, expr);
1548
1549 name = SCM_CAR (binding);
1550 ASSERT_SYNTAX_2 (scm_is_symbol (name), s_bad_variable, name, expr);
1551 }
1552 }
1553
1554
1555 /* The bindings, which must have the format ((v1 i1) (v2 i2) ... (vn in)), are
1556 * transformed to the lists (vn ... v2 v1) and (i1 i2 ... in). That is, the
1557 * variables are returned in a list with their order reversed, and the init
1558 * forms are returned in a list in the same order as they are given in the
1559 * bindings. If a duplicate variable name is detected, an error is
1560 * signalled. */
1561 static void
1562 transform_bindings (
1563 const SCM bindings, const SCM expr,
1564 SCM *const rvarptr, SCM *const initptr )
1565 {
1566 SCM rvariables = SCM_EOL;
1567 SCM rinits = SCM_EOL;
1568 SCM binding_idx = bindings;
1569 for (; !scm_is_null (binding_idx); binding_idx = SCM_CDR (binding_idx))
1570 {
1571 const SCM binding = SCM_CAR (binding_idx);
1572 const SCM cdr_binding = SCM_CDR (binding);
1573 const SCM name = SCM_CAR (binding);
1574 ASSERT_SYNTAX_2 (scm_is_false (scm_c_memq (name, rvariables)),
1575 s_duplicate_binding, name, expr);
1576 rvariables = scm_cons (name, rvariables);
1577 rinits = scm_cons (SCM_CAR (cdr_binding), rinits);
1578 }
1579 *rvarptr = rvariables;
1580 *initptr = scm_reverse_x (rinits, SCM_UNDEFINED);
1581 }
1582
1583
1584 SCM_SYNTAX(s_let, "let", scm_i_makbimacro, scm_m_let);
1585 SCM_GLOBAL_SYMBOL(scm_sym_let, s_let);
1586
1587 /* This function is a helper function for memoize_let. It transforms
1588 * (let name ((var init) ...) body ...) into
1589 * ((letrec ((name (lambda (var ...) body ...))) name) init ...)
1590 * and memoizes the expression. It is assumed that the caller has checked
1591 * that name is a symbol and that there are bindings and a body. */
1592 static SCM
1593 memoize_named_let (const SCM expr, const SCM env SCM_UNUSED)
1594 {
1595 SCM rvariables;
1596 SCM variables;
1597 SCM inits;
1598
1599 const SCM cdr_expr = SCM_CDR (expr);
1600 const SCM name = SCM_CAR (cdr_expr);
1601 const SCM cddr_expr = SCM_CDR (cdr_expr);
1602 const SCM bindings = SCM_CAR (cddr_expr);
1603 check_bindings (bindings, expr);
1604
1605 transform_bindings (bindings, expr, &rvariables, &inits);
1606 variables = scm_reverse_x (rvariables, SCM_UNDEFINED);
1607
1608 {
1609 const SCM let_body = SCM_CDR (cddr_expr);
1610 const SCM lambda_body = m_body (SCM_IM_LET, let_body);
1611 const SCM lambda_tail = scm_cons (variables, lambda_body);
1612 const SCM lambda_form = scm_cons_source (expr, scm_sym_lambda, lambda_tail);
1613
1614 const SCM rvar = scm_list_1 (name);
1615 const SCM init = scm_list_1 (lambda_form);
1616 const SCM body = m_body (SCM_IM_LET, scm_list_1 (name));
1617 const SCM letrec_tail = scm_cons (rvar, scm_cons (init, body));
1618 const SCM letrec_form = scm_cons_source (expr, SCM_IM_LETREC, letrec_tail);
1619 return scm_cons_source (expr, letrec_form, inits);
1620 }
1621 }
1622
1623 /* (let ((v1 i1) (v2 i2) ...) body) with variables v1 .. vn and initializers
1624 * i1 .. in is transformed to (#@let (vn ... v2 v1) (i1 i2 ...) body). */
1625 SCM
1626 scm_m_let (SCM expr, SCM env)
1627 {
1628 SCM bindings;
1629
1630 const SCM cdr_expr = SCM_CDR (expr);
1631 const long length = scm_ilength (cdr_expr);
1632 ASSERT_SYNTAX (length >= 0, s_bad_expression, expr);
1633 ASSERT_SYNTAX (length >= 2, s_missing_expression, expr);
1634
1635 bindings = SCM_CAR (cdr_expr);
1636 if (scm_is_symbol (bindings))
1637 {
1638 ASSERT_SYNTAX (length >= 3, s_missing_expression, expr);
1639 return memoize_named_let (expr, env);
1640 }
1641
1642 check_bindings (bindings, expr);
1643 if (scm_is_null (bindings) || scm_is_null (SCM_CDR (bindings)))
1644 {
1645 /* Special case: no bindings or single binding => let* is faster. */
1646 const SCM body = m_body (SCM_IM_LET, SCM_CDR (cdr_expr));
1647 return scm_m_letstar (scm_cons2 (SCM_CAR (expr), bindings, body), env);
1648 }
1649 else
1650 {
1651 /* plain let */
1652 SCM rvariables;
1653 SCM inits;
1654 transform_bindings (bindings, expr, &rvariables, &inits);
1655
1656 {
1657 const SCM new_body = m_body (SCM_IM_LET, SCM_CDR (cdr_expr));
1658 const SCM new_tail = scm_cons2 (rvariables, inits, new_body);
1659 SCM_SETCAR (expr, SCM_IM_LET);
1660 SCM_SETCDR (expr, new_tail);
1661 return expr;
1662 }
1663 }
1664 }
1665
1666 static SCM
1667 build_binding_list (SCM rnames, SCM rinits)
1668 {
1669 SCM bindings = SCM_EOL;
1670 while (!scm_is_null (rnames))
1671 {
1672 const SCM binding = scm_list_2 (SCM_CAR (rnames), SCM_CAR (rinits));
1673 bindings = scm_cons (binding, bindings);
1674 rnames = SCM_CDR (rnames);
1675 rinits = SCM_CDR (rinits);
1676 }
1677 return bindings;
1678 }
1679
1680 static SCM
1681 unmemoize_let (const SCM expr, const SCM env)
1682 {
1683 const SCM cdr_expr = SCM_CDR (expr);
1684 const SCM um_rnames = SCM_CAR (cdr_expr);
1685 const SCM extended_env = SCM_EXTEND_ENV (um_rnames, SCM_EOL, env);
1686 const SCM cddr_expr = SCM_CDR (cdr_expr);
1687 const SCM um_inits = unmemoize_exprs (SCM_CAR (cddr_expr), env);
1688 const SCM um_rinits = scm_reverse_x (um_inits, SCM_UNDEFINED);
1689 const SCM um_bindings = build_binding_list (um_rnames, um_rinits);
1690 const SCM um_body = unmemoize_exprs (SCM_CDR (cddr_expr), extended_env);
1691
1692 return scm_cons2 (scm_sym_let, um_bindings, um_body);
1693 }
1694
1695
1696 SCM_SYNTAX(s_letrec, "letrec", scm_i_makbimacro, scm_m_letrec);
1697 SCM_GLOBAL_SYMBOL(scm_sym_letrec, s_letrec);
1698
1699 SCM
1700 scm_m_letrec (SCM expr, SCM env)
1701 {
1702 SCM bindings;
1703
1704 const SCM cdr_expr = SCM_CDR (expr);
1705 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
1706 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 2, s_missing_expression, expr);
1707
1708 bindings = SCM_CAR (cdr_expr);
1709 if (scm_is_null (bindings))
1710 {
1711 /* no bindings, let* is executed faster */
1712 SCM body = m_body (SCM_IM_LETREC, SCM_CDR (cdr_expr));
1713 return scm_m_letstar (scm_cons2 (SCM_CAR (expr), SCM_EOL, body), env);
1714 }
1715 else
1716 {
1717 SCM rvariables;
1718 SCM inits;
1719 SCM new_body;
1720
1721 check_bindings (bindings, expr);
1722 transform_bindings (bindings, expr, &rvariables, &inits);
1723 new_body = m_body (SCM_IM_LETREC, SCM_CDR (cdr_expr));
1724 return scm_cons2 (SCM_IM_LETREC, rvariables, scm_cons (inits, new_body));
1725 }
1726 }
1727
1728 static SCM
1729 unmemoize_letrec (const SCM expr, const SCM env)
1730 {
1731 const SCM cdr_expr = SCM_CDR (expr);
1732 const SCM um_rnames = SCM_CAR (cdr_expr);
1733 const SCM extended_env = SCM_EXTEND_ENV (um_rnames, SCM_EOL, env);
1734 const SCM cddr_expr = SCM_CDR (cdr_expr);
1735 const SCM um_inits = unmemoize_exprs (SCM_CAR (cddr_expr), extended_env);
1736 const SCM um_rinits = scm_reverse_x (um_inits, SCM_UNDEFINED);
1737 const SCM um_bindings = build_binding_list (um_rnames, um_rinits);
1738 const SCM um_body = unmemoize_exprs (SCM_CDR (cddr_expr), extended_env);
1739
1740 return scm_cons2 (scm_sym_letrec, um_bindings, um_body);
1741 }
1742
1743
1744
1745 SCM_SYNTAX (s_letstar, "let*", scm_i_makbimacro, scm_m_letstar);
1746 SCM_GLOBAL_SYMBOL (scm_sym_letstar, s_letstar);
1747
1748 /* (let* ((v1 i1) (v2 i2) ...) body) with variables v1 .. vn and initializers
1749 * i1 .. in is transformed into the form (#@let* (v1 i1 v2 i2 ...) body). */
1750 SCM
1751 scm_m_letstar (SCM expr, SCM env SCM_UNUSED)
1752 {
1753 SCM binding_idx;
1754 SCM new_body;
1755
1756 const SCM cdr_expr = SCM_CDR (expr);
1757 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
1758 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 2, s_missing_expression, expr);
1759
1760 binding_idx = SCM_CAR (cdr_expr);
1761 check_bindings (binding_idx, expr);
1762
1763 /* Transform ((v1 i1) (v2 i2) ...) into (v1 i1 v2 i2 ...). The
1764 * transformation is done in place. At the beginning of one iteration of
1765 * the loop the variable binding_idx holds the form
1766 * P1:( (vn . P2:(in . ())) . P3:( (vn+1 in+1) ... ) ),
1767 * where P1, P2 and P3 indicate the pairs, that are relevant for the
1768 * transformation. P1 and P2 are modified in the loop, P3 remains
1769 * untouched. After the execution of the loop, P1 will hold
1770 * P1:( vn . P2:(in . P3:( (vn+1 in+1) ... )) )
1771 * and binding_idx will hold P3. */
1772 while (!scm_is_null (binding_idx))
1773 {
1774 const SCM cdr_binding_idx = SCM_CDR (binding_idx); /* remember P3 */
1775 const SCM binding = SCM_CAR (binding_idx);
1776 const SCM name = SCM_CAR (binding);
1777 const SCM cdr_binding = SCM_CDR (binding);
1778
1779 SCM_SETCDR (cdr_binding, cdr_binding_idx); /* update P2 */
1780 SCM_SETCAR (binding_idx, name); /* update P1 */
1781 SCM_SETCDR (binding_idx, cdr_binding); /* update P1 */
1782
1783 binding_idx = cdr_binding_idx; /* continue with P3 */
1784 }
1785
1786 new_body = m_body (SCM_IM_LETSTAR, SCM_CDR (cdr_expr));
1787 SCM_SETCAR (expr, SCM_IM_LETSTAR);
1788 /* the bindings have been changed in place */
1789 SCM_SETCDR (cdr_expr, new_body);
1790 return expr;
1791 }
1792
1793 static SCM
1794 unmemoize_letstar (const SCM expr, const SCM env)
1795 {
1796 const SCM cdr_expr = SCM_CDR (expr);
1797 const SCM body = SCM_CDR (cdr_expr);
1798 SCM bindings = SCM_CAR (cdr_expr);
1799 SCM um_bindings = SCM_EOL;
1800 SCM extended_env = env;
1801 SCM um_body;
1802
1803 while (!scm_is_null (bindings))
1804 {
1805 const SCM variable = SCM_CAR (bindings);
1806 const SCM init = SCM_CADR (bindings);
1807 const SCM um_init = unmemoize_expression (init, extended_env);
1808 um_bindings = scm_cons (scm_list_2 (variable, um_init), um_bindings);
1809 extended_env = SCM_EXTEND_ENV (variable, SCM_BOOL_F, extended_env);
1810 bindings = SCM_CDDR (bindings);
1811 }
1812 um_bindings = scm_reverse_x (um_bindings, SCM_UNDEFINED);
1813
1814 um_body = unmemoize_exprs (body, extended_env);
1815
1816 return scm_cons2 (scm_sym_letstar, um_bindings, um_body);
1817 }
1818
1819
1820 SCM_SYNTAX (s_or, "or", scm_i_makbimacro, scm_m_or);
1821 SCM_GLOBAL_SYMBOL (scm_sym_or, s_or);
1822
1823 SCM
1824 scm_m_or (SCM expr, SCM env SCM_UNUSED)
1825 {
1826 const SCM cdr_expr = SCM_CDR (expr);
1827 const long length = scm_ilength (cdr_expr);
1828
1829 ASSERT_SYNTAX (length >= 0, s_bad_expression, expr);
1830
1831 if (length == 0)
1832 {
1833 /* Special case: (or) is replaced by #f. */
1834 return SCM_BOOL_F;
1835 }
1836 else
1837 {
1838 SCM_SETCAR (expr, SCM_IM_OR);
1839 return expr;
1840 }
1841 }
1842
1843 static SCM
1844 unmemoize_or (const SCM expr, const SCM env)
1845 {
1846 return scm_cons (scm_sym_or, unmemoize_exprs (SCM_CDR (expr), env));
1847 }
1848
1849
1850 SCM_SYNTAX (s_quasiquote, "quasiquote", scm_makacro, scm_m_quasiquote);
1851 SCM_GLOBAL_SYMBOL (scm_sym_quasiquote, s_quasiquote);
1852 SCM_GLOBAL_SYMBOL (scm_sym_unquote, "unquote");
1853 SCM_GLOBAL_SYMBOL (scm_sym_uq_splicing, "unquote-splicing");
1854
1855 /* Internal function to handle a quasiquotation: 'form' is the parameter in
1856 * the call (quasiquotation form), 'env' is the environment where unquoted
1857 * expressions will be evaluated, and 'depth' is the current quasiquotation
1858 * nesting level and is known to be greater than zero. */
1859 static SCM
1860 iqq (SCM form, SCM env, unsigned long int depth)
1861 {
1862 if (scm_is_pair (form))
1863 {
1864 const SCM tmp = SCM_CAR (form);
1865 if (scm_is_eq (tmp, scm_sym_quasiquote))
1866 {
1867 const SCM args = SCM_CDR (form);
1868 ASSERT_SYNTAX (scm_ilength (args) == 1, s_expression, form);
1869 return scm_list_2 (tmp, iqq (SCM_CAR (args), env, depth + 1));
1870 }
1871 else if (scm_is_eq (tmp, scm_sym_unquote))
1872 {
1873 const SCM args = SCM_CDR (form);
1874 ASSERT_SYNTAX (scm_ilength (args) == 1, s_expression, form);
1875 if (depth - 1 == 0)
1876 return scm_eval_car (args, env);
1877 else
1878 return scm_list_2 (tmp, iqq (SCM_CAR (args), env, depth - 1));
1879 }
1880 else if (scm_is_pair (tmp)
1881 && scm_is_eq (SCM_CAR (tmp), scm_sym_uq_splicing))
1882 {
1883 const SCM args = SCM_CDR (tmp);
1884 ASSERT_SYNTAX (scm_ilength (args) == 1, s_expression, form);
1885 if (depth - 1 == 0)
1886 {
1887 const SCM list = scm_eval_car (args, env);
1888 const SCM rest = SCM_CDR (form);
1889 ASSERT_SYNTAX_2 (scm_ilength (list) >= 0,
1890 s_splicing, list, form);
1891 return scm_append (scm_list_2 (list, iqq (rest, env, depth)));
1892 }
1893 else
1894 return scm_cons (iqq (SCM_CAR (form), env, depth - 1),
1895 iqq (SCM_CDR (form), env, depth));
1896 }
1897 else
1898 return scm_cons (iqq (SCM_CAR (form), env, depth),
1899 iqq (SCM_CDR (form), env, depth));
1900 }
1901 else if (scm_is_vector (form))
1902 return scm_vector (iqq (scm_vector_to_list (form), env, depth));
1903 else
1904 return form;
1905 }
1906
1907 SCM
1908 scm_m_quasiquote (SCM expr, SCM env)
1909 {
1910 const SCM cdr_expr = SCM_CDR (expr);
1911 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
1912 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 1, s_expression, expr);
1913 return iqq (SCM_CAR (cdr_expr), env, 1);
1914 }
1915
1916
1917 SCM_SYNTAX (s_quote, "quote", scm_i_makbimacro, scm_m_quote);
1918 SCM_GLOBAL_SYMBOL (scm_sym_quote, s_quote);
1919
1920 SCM
1921 scm_m_quote (SCM expr, SCM env SCM_UNUSED)
1922 {
1923 SCM quotee;
1924
1925 const SCM cdr_expr = SCM_CDR (expr);
1926 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
1927 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 1, s_expression, expr);
1928 quotee = SCM_CAR (cdr_expr);
1929 if (is_self_quoting_p (quotee))
1930 return quotee;
1931
1932 SCM_SETCAR (expr, SCM_IM_QUOTE);
1933 SCM_SETCDR (expr, quotee);
1934 return expr;
1935 }
1936
1937 static SCM
1938 unmemoize_quote (const SCM expr, const SCM env SCM_UNUSED)
1939 {
1940 return scm_list_2 (scm_sym_quote, SCM_CDR (expr));
1941 }
1942
1943
1944 /* Will go into the RnRS module when Guile is factorized.
1945 SCM_SYNTAX (s_set_x, "set!", scm_i_makbimacro, scm_m_set_x); */
1946 static const char s_set_x[] = "set!";
1947 SCM_GLOBAL_SYMBOL (scm_sym_set_x, s_set_x);
1948
1949 SCM
1950 scm_m_set_x (SCM expr, SCM env SCM_UNUSED)
1951 {
1952 SCM variable;
1953 SCM new_variable;
1954
1955 const SCM cdr_expr = SCM_CDR (expr);
1956 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
1957 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 2, s_expression, expr);
1958 variable = SCM_CAR (cdr_expr);
1959
1960 /* Memoize the variable form. */
1961 ASSERT_SYNTAX_2 (scm_is_symbol (variable), s_bad_variable, variable, expr);
1962 new_variable = lookup_symbol (variable, env);
1963 /* Leave the memoization of unbound symbols to lazy memoization: */
1964 if (SCM_UNBNDP (new_variable))
1965 new_variable = variable;
1966
1967 SCM_SETCAR (expr, SCM_IM_SET_X);
1968 SCM_SETCAR (cdr_expr, new_variable);
1969 return expr;
1970 }
1971
1972 static SCM
1973 unmemoize_set_x (const SCM expr, const SCM env)
1974 {
1975 return scm_cons (scm_sym_set_x, unmemoize_exprs (SCM_CDR (expr), env));
1976 }
1977
1978
1979 /* Start of the memoizers for non-R5RS builtin macros. */
1980
1981
1982 SCM_SYNTAX (s_at, "@", scm_makmmacro, scm_m_at);
1983 SCM_GLOBAL_SYMBOL (scm_sym_at, s_at);
1984
1985 SCM
1986 scm_m_at (SCM expr, SCM env SCM_UNUSED)
1987 {
1988 SCM mod, var;
1989 ASSERT_SYNTAX (scm_ilength (expr) == 3, s_bad_expression, expr);
1990 ASSERT_SYNTAX (scm_ilength (scm_cadr (expr)) > 0, s_bad_expression, expr);
1991 ASSERT_SYNTAX (scm_is_symbol (scm_caddr (expr)), s_bad_expression, expr);
1992
1993 mod = scm_resolve_module (scm_cadr (expr));
1994 if (scm_is_false (mod))
1995 error_unbound_variable (expr);
1996 var = scm_module_variable (scm_module_public_interface (mod), scm_caddr (expr));
1997 if (scm_is_false (var))
1998 error_unbound_variable (expr);
1999
2000 return var;
2001 }
2002
2003 SCM_SYNTAX (s_atat, "@@", scm_makmmacro, scm_m_atat);
2004 SCM_GLOBAL_SYMBOL (scm_sym_atat, s_atat);
2005
2006 SCM
2007 scm_m_atat (SCM expr, SCM env SCM_UNUSED)
2008 {
2009 SCM mod, var;
2010 ASSERT_SYNTAX (scm_ilength (expr) == 3, s_bad_expression, expr);
2011 ASSERT_SYNTAX (scm_ilength (scm_cadr (expr)) > 0, s_bad_expression, expr);
2012 ASSERT_SYNTAX (scm_is_symbol (scm_caddr (expr)), s_bad_expression, expr);
2013
2014 mod = scm_resolve_module (scm_cadr (expr));
2015 if (scm_is_false (mod))
2016 error_unbound_variable (expr);
2017 var = scm_module_variable (mod, scm_caddr (expr));
2018 if (scm_is_false (var))
2019 error_unbound_variable (expr);
2020
2021 return var;
2022 }
2023
2024 SCM_SYNTAX (s_atapply, "@apply", scm_i_makbimacro, scm_m_apply);
2025 SCM_GLOBAL_SYMBOL (scm_sym_atapply, s_atapply);
2026 SCM_GLOBAL_SYMBOL (scm_sym_apply, s_atapply + 1);
2027
2028 SCM
2029 scm_m_apply (SCM expr, SCM env SCM_UNUSED)
2030 {
2031 const SCM cdr_expr = SCM_CDR (expr);
2032 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
2033 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 2, s_missing_expression, expr);
2034
2035 SCM_SETCAR (expr, SCM_IM_APPLY);
2036 return expr;
2037 }
2038
2039 static SCM
2040 unmemoize_apply (const SCM expr, const SCM env)
2041 {
2042 return scm_list_2 (scm_sym_atapply, unmemoize_exprs (SCM_CDR (expr), env));
2043 }
2044
2045
2046 SCM_SYNTAX (s_atbind, "@bind", scm_i_makbimacro, scm_m_atbind);
2047
2048 /* FIXME: The following explanation should go into the documentation: */
2049 /* (@bind ((var init) ...) body ...) will assign the values of the `init's to
2050 * the global variables named by `var's (symbols, not evaluated), creating
2051 * them if they don't exist, executes body, and then restores the previous
2052 * values of the `var's. Additionally, whenever control leaves body, the
2053 * values of the `var's are saved and restored when control returns. It is an
2054 * error when a symbol appears more than once among the `var's. All `init's
2055 * are evaluated before any `var' is set.
2056 *
2057 * Think of this as `let' for dynamic scope.
2058 */
2059
2060 /* (@bind ((var1 exp1) ... (varn expn)) body ...) is memoized into
2061 * (#@bind ((varn ... var1) . (exp1 ... expn)) body ...).
2062 *
2063 * FIXME - also implement `@bind*'.
2064 */
2065 SCM
2066 scm_m_atbind (SCM expr, SCM env)
2067 {
2068 SCM bindings;
2069 SCM rvariables;
2070 SCM inits;
2071 SCM variable_idx;
2072
2073 const SCM top_level = scm_env_top_level (env);
2074
2075 const SCM cdr_expr = SCM_CDR (expr);
2076 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
2077 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 2, s_missing_expression, expr);
2078 bindings = SCM_CAR (cdr_expr);
2079 check_bindings (bindings, expr);
2080 transform_bindings (bindings, expr, &rvariables, &inits);
2081
2082 for (variable_idx = rvariables;
2083 !scm_is_null (variable_idx);
2084 variable_idx = SCM_CDR (variable_idx))
2085 {
2086 /* The first call to scm_sym2var will look beyond the current module,
2087 * while the second call wont. */
2088 const SCM variable = SCM_CAR (variable_idx);
2089 SCM new_variable = scm_sym2var (variable, top_level, SCM_BOOL_F);
2090 if (scm_is_false (new_variable))
2091 new_variable = scm_sym2var (variable, top_level, SCM_BOOL_T);
2092 SCM_SETCAR (variable_idx, new_variable);
2093 }
2094
2095 SCM_SETCAR (expr, SCM_IM_BIND);
2096 SCM_SETCAR (cdr_expr, scm_cons (rvariables, inits));
2097 return expr;
2098 }
2099
2100
2101 SCM_SYNTAX(s_atcall_cc, "@call-with-current-continuation", scm_i_makbimacro, scm_m_cont);
2102 SCM_GLOBAL_SYMBOL(scm_sym_atcall_cc, s_atcall_cc);
2103
2104 SCM
2105 scm_m_cont (SCM expr, SCM env SCM_UNUSED)
2106 {
2107 const SCM cdr_expr = SCM_CDR (expr);
2108 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
2109 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 1, s_expression, expr);
2110
2111 SCM_SETCAR (expr, SCM_IM_CONT);
2112 return expr;
2113 }
2114
2115 static SCM
2116 unmemoize_atcall_cc (const SCM expr, const SCM env)
2117 {
2118 return scm_list_2 (scm_sym_atcall_cc, unmemoize_exprs (SCM_CDR (expr), env));
2119 }
2120
2121
2122 SCM_SYNTAX (s_at_call_with_values, "@call-with-values", scm_i_makbimacro, scm_m_at_call_with_values);
2123 SCM_GLOBAL_SYMBOL(scm_sym_at_call_with_values, s_at_call_with_values);
2124
2125 SCM
2126 scm_m_at_call_with_values (SCM expr, SCM env SCM_UNUSED)
2127 {
2128 const SCM cdr_expr = SCM_CDR (expr);
2129 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
2130 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 2, s_expression, expr);
2131
2132 SCM_SETCAR (expr, SCM_IM_CALL_WITH_VALUES);
2133 return expr;
2134 }
2135
2136 static SCM
2137 unmemoize_at_call_with_values (const SCM expr, const SCM env)
2138 {
2139 return scm_list_2 (scm_sym_at_call_with_values,
2140 unmemoize_exprs (SCM_CDR (expr), env));
2141 }
2142
2143 SCM_SYNTAX (s_eval_when, "eval-when", scm_makmmacro, scm_m_eval_when);
2144 SCM_GLOBAL_SYMBOL (scm_sym_eval_when, s_eval_when);
2145 SCM_SYMBOL (sym_eval, "eval");
2146 SCM_SYMBOL (sym_load, "load");
2147
2148
2149 SCM
2150 scm_m_eval_when (SCM expr, SCM env SCM_UNUSED)
2151 {
2152 ASSERT_SYNTAX (scm_ilength (expr) == 3, s_bad_expression, expr);
2153 ASSERT_SYNTAX (scm_ilength (scm_cadr (expr)) > 0, s_bad_expression, expr);
2154
2155 if (scm_is_true (scm_memq (sym_eval, scm_cadr (expr)))
2156 || scm_is_true (scm_memq (sym_load, scm_cadr (expr))))
2157 return scm_caddr (expr);
2158
2159 return scm_list_1 (SCM_IM_BEGIN);
2160 }
2161
2162 #if 0
2163
2164 /* See futures.h for a comment why futures are not enabled.
2165 */
2166
2167 SCM_SYNTAX (s_future, "future", scm_i_makbimacro, scm_m_future);
2168 SCM_GLOBAL_SYMBOL (scm_sym_future, s_future);
2169
2170 /* Like promises, futures are implemented as closures with an empty
2171 * parameter list. Thus, (future <expression>) is transformed into
2172 * (#@future '() <expression>), where the empty list represents the
2173 * empty parameter list. This representation allows for easy creation
2174 * of the closure during evaluation. */
2175 SCM
2176 scm_m_future (SCM expr, SCM env)
2177 {
2178 const SCM new_expr = memoize_as_thunk_prototype (expr, env);
2179 SCM_SETCAR (new_expr, SCM_IM_FUTURE);
2180 return new_expr;
2181 }
2182
2183 static SCM
2184 unmemoize_future (const SCM expr, const SCM env)
2185 {
2186 const SCM thunk_expr = SCM_CADDR (expr);
2187 return scm_list_2 (scm_sym_future, unmemoize_expression (thunk_expr, env));
2188 }
2189
2190 #endif /* futures disabled. */
2191
2192 SCM_SYNTAX (s_gset_x, "set!", scm_i_makbimacro, scm_m_generalized_set_x);
2193 SCM_SYMBOL (scm_sym_setter, "setter");
2194
2195 SCM
2196 scm_m_generalized_set_x (SCM expr, SCM env)
2197 {
2198 SCM target, exp_target;
2199
2200 const SCM cdr_expr = SCM_CDR (expr);
2201 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
2202 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 2, s_expression, expr);
2203
2204 target = SCM_CAR (cdr_expr);
2205 if (!scm_is_pair (target))
2206 {
2207 /* R5RS usage */
2208 return scm_m_set_x (expr, env);
2209 }
2210 else
2211 {
2212 /* (set! (foo bar ...) baz) becomes ((setter foo) bar ... baz) */
2213 /* Macroexpanding the target might return things of the form
2214 (begin <atom>). In that case, <atom> must be a symbol or a
2215 variable and we memoize to (set! <atom> ...).
2216 */
2217 exp_target = macroexp (target, env);
2218 if (scm_is_eq (SCM_CAR (exp_target), SCM_IM_BEGIN)
2219 && !scm_is_null (SCM_CDR (exp_target))
2220 && scm_is_null (SCM_CDDR (exp_target)))
2221 {
2222 exp_target= SCM_CADR (exp_target);
2223 ASSERT_SYNTAX_2 (scm_is_symbol (exp_target)
2224 || SCM_VARIABLEP (exp_target),
2225 s_bad_variable, exp_target, expr);
2226 return scm_cons (SCM_IM_SET_X, scm_cons (exp_target,
2227 SCM_CDR (cdr_expr)));
2228 }
2229 else
2230 {
2231 const SCM setter_proc_tail = scm_list_1 (SCM_CAR (target));
2232 const SCM setter_proc = scm_cons_source (expr, scm_sym_setter,
2233 setter_proc_tail);
2234
2235 const SCM cddr_expr = SCM_CDR (cdr_expr);
2236 const SCM setter_args = scm_append_x (scm_list_2 (SCM_CDR (target),
2237 cddr_expr));
2238
2239 SCM_SETCAR (expr, setter_proc);
2240 SCM_SETCDR (expr, setter_args);
2241 return expr;
2242 }
2243 }
2244 }
2245
2246
2247 /* @slot-ref is bound privately in the (oop goops) module from goops.c. As
2248 * soon as the module system allows us to more freely create bindings in
2249 * arbitrary modules during the startup phase, the code from goops.c should be
2250 * moved here. */
2251
2252 SCM_SYMBOL (sym_atslot_ref, "@slot-ref");
2253
2254 SCM
2255 scm_m_atslot_ref (SCM expr, SCM env SCM_UNUSED)
2256 {
2257 SCM slot_nr;
2258
2259 const SCM cdr_expr = SCM_CDR (expr);
2260 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
2261 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 2, s_expression, expr);
2262 slot_nr = SCM_CADR (cdr_expr);
2263 ASSERT_SYNTAX_2 (SCM_I_INUMP (slot_nr), s_bad_slot_number, slot_nr, expr);
2264
2265 SCM_SETCAR (expr, SCM_IM_SLOT_REF);
2266 SCM_SETCDR (cdr_expr, slot_nr);
2267 return expr;
2268 }
2269
2270 static SCM
2271 unmemoize_atslot_ref (const SCM expr, const SCM env)
2272 {
2273 const SCM instance = SCM_CADR (expr);
2274 const SCM um_instance = unmemoize_expression (instance, env);
2275 const SCM slot_nr = SCM_CDDR (expr);
2276 return scm_list_3 (sym_atslot_ref, um_instance, slot_nr);
2277 }
2278
2279
2280 /* @slot-set! is bound privately in the (oop goops) module from goops.c. As
2281 * soon as the module system allows us to more freely create bindings in
2282 * arbitrary modules during the startup phase, the code from goops.c should be
2283 * moved here. */
2284
2285 SCM_SYMBOL (sym_atslot_set_x, "@slot-set!");
2286
2287 SCM
2288 scm_m_atslot_set_x (SCM expr, SCM env SCM_UNUSED)
2289 {
2290 SCM slot_nr;
2291
2292 const SCM cdr_expr = SCM_CDR (expr);
2293 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
2294 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 3, s_expression, expr);
2295 slot_nr = SCM_CADR (cdr_expr);
2296 ASSERT_SYNTAX_2 (SCM_I_INUMP (slot_nr), s_bad_slot_number, slot_nr, expr);
2297
2298 SCM_SETCAR (expr, SCM_IM_SLOT_SET_X);
2299 return expr;
2300 }
2301
2302 static SCM
2303 unmemoize_atslot_set_x (const SCM expr, const SCM env)
2304 {
2305 const SCM cdr_expr = SCM_CDR (expr);
2306 const SCM instance = SCM_CAR (cdr_expr);
2307 const SCM um_instance = unmemoize_expression (instance, env);
2308 const SCM cddr_expr = SCM_CDR (cdr_expr);
2309 const SCM slot_nr = SCM_CAR (cddr_expr);
2310 const SCM cdddr_expr = SCM_CDR (cddr_expr);
2311 const SCM value = SCM_CAR (cdddr_expr);
2312 const SCM um_value = unmemoize_expression (value, env);
2313 return scm_list_4 (sym_atslot_set_x, um_instance, slot_nr, um_value);
2314 }
2315
2316
2317 #if SCM_ENABLE_ELISP
2318
2319 static const char s_defun[] = "Symbol's function definition is void";
2320
2321 SCM_SYNTAX (s_nil_cond, "nil-cond", scm_i_makbimacro, scm_m_nil_cond);
2322
2323 /* nil-cond expressions have the form
2324 * (nil-cond COND VAL COND VAL ... ELSEVAL) */
2325 SCM
2326 scm_m_nil_cond (SCM expr, SCM env SCM_UNUSED)
2327 {
2328 const long length = scm_ilength (SCM_CDR (expr));
2329 ASSERT_SYNTAX (length >= 0, s_bad_expression, expr);
2330 ASSERT_SYNTAX (length >= 1 && (length % 2) == 1, s_expression, expr);
2331
2332 SCM_SETCAR (expr, SCM_IM_NIL_COND);
2333 return expr;
2334 }
2335
2336
2337 SCM_SYNTAX (s_atfop, "@fop", scm_i_makbimacro, scm_m_atfop);
2338
2339 /* The @fop-macro handles procedure and macro applications for elisp. The
2340 * input expression must have the form
2341 * (@fop <var> (transformer-macro <expr> ...))
2342 * where <var> must be a symbol. The expression is transformed into the
2343 * memoized form of either
2344 * (apply <un-aliased var> (transformer-macro <expr> ...))
2345 * if the value of var (across all aliasing) is not a macro, or
2346 * (<un-aliased var> <expr> ...)
2347 * if var is a macro. */
2348 SCM
2349 scm_m_atfop (SCM expr, SCM env SCM_UNUSED)
2350 {
2351 SCM location;
2352 SCM symbol;
2353
2354 const SCM cdr_expr = SCM_CDR (expr);
2355 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
2356 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 1, s_missing_expression, expr);
2357
2358 symbol = SCM_CAR (cdr_expr);
2359 ASSERT_SYNTAX_2 (scm_is_symbol (symbol), s_bad_variable, symbol, expr);
2360
2361 location = scm_symbol_fref (symbol);
2362 ASSERT_SYNTAX_2 (SCM_VARIABLEP (location), s_defun, symbol, expr);
2363
2364 /* The elisp function `defalias' allows to define aliases for symbols. To
2365 * look up such definitions, the chain of symbol definitions has to be
2366 * followed up to the terminal symbol. */
2367 while (scm_is_symbol (SCM_VARIABLE_REF (location)))
2368 {
2369 const SCM alias = SCM_VARIABLE_REF (location);
2370 location = scm_symbol_fref (alias);
2371 ASSERT_SYNTAX_2 (SCM_VARIABLEP (location), s_defun, symbol, expr);
2372 }
2373
2374 /* Memoize the value location belonging to the terminal symbol. */
2375 SCM_SETCAR (cdr_expr, location);
2376
2377 if (!SCM_MACROP (SCM_VARIABLE_REF (location)))
2378 {
2379 /* Since the location does not contain a macro, the form is a procedure
2380 * application. Replace `@fop' by `@apply' and transform the expression
2381 * including the `transformer-macro'. */
2382 SCM_SETCAR (expr, SCM_IM_APPLY);
2383 return expr;
2384 }
2385 else
2386 {
2387 /* Since the location contains a macro, the arguments should not be
2388 * transformed, so the `transformer-macro' is cut out. The resulting
2389 * expression starts with the memoized variable, that is at the cdr of
2390 * the input expression. */
2391 SCM_SETCDR (cdr_expr, SCM_CDADR (cdr_expr));
2392 return cdr_expr;
2393 }
2394 }
2395
2396 #endif /* SCM_ENABLE_ELISP */
2397
2398
2399 static SCM
2400 unmemoize_builtin_macro (const SCM expr, const SCM env)
2401 {
2402 switch (ISYMNUM (SCM_CAR (expr)))
2403 {
2404 case (ISYMNUM (SCM_IM_AND)):
2405 return unmemoize_and (expr, env);
2406
2407 case (ISYMNUM (SCM_IM_BEGIN)):
2408 return unmemoize_begin (expr, env);
2409
2410 case (ISYMNUM (SCM_IM_CASE)):
2411 return unmemoize_case (expr, env);
2412
2413 case (ISYMNUM (SCM_IM_COND)):
2414 return unmemoize_cond (expr, env);
2415
2416 case (ISYMNUM (SCM_IM_DELAY)):
2417 return unmemoize_delay (expr, env);
2418
2419 case (ISYMNUM (SCM_IM_DO)):
2420 return unmemoize_do (expr, env);
2421
2422 case (ISYMNUM (SCM_IM_IF)):
2423 return unmemoize_if (expr, env);
2424
2425 case (ISYMNUM (SCM_IM_LAMBDA)):
2426 return unmemoize_lambda (expr, env);
2427
2428 case (ISYMNUM (SCM_IM_LET)):
2429 return unmemoize_let (expr, env);
2430
2431 case (ISYMNUM (SCM_IM_LETREC)):
2432 return unmemoize_letrec (expr, env);
2433
2434 case (ISYMNUM (SCM_IM_LETSTAR)):
2435 return unmemoize_letstar (expr, env);
2436
2437 case (ISYMNUM (SCM_IM_OR)):
2438 return unmemoize_or (expr, env);
2439
2440 case (ISYMNUM (SCM_IM_QUOTE)):
2441 return unmemoize_quote (expr, env);
2442
2443 case (ISYMNUM (SCM_IM_SET_X)):
2444 return unmemoize_set_x (expr, env);
2445
2446 case (ISYMNUM (SCM_IM_APPLY)):
2447 return unmemoize_apply (expr, env);
2448
2449 case (ISYMNUM (SCM_IM_BIND)):
2450 return unmemoize_exprs (expr, env); /* FIXME */
2451
2452 case (ISYMNUM (SCM_IM_CONT)):
2453 return unmemoize_atcall_cc (expr, env);
2454
2455 case (ISYMNUM (SCM_IM_CALL_WITH_VALUES)):
2456 return unmemoize_at_call_with_values (expr, env);
2457
2458 #if 0
2459 /* See futures.h for a comment why futures are not enabled.
2460 */
2461 case (ISYMNUM (SCM_IM_FUTURE)):
2462 return unmemoize_future (expr, env);
2463 #endif
2464
2465 case (ISYMNUM (SCM_IM_SLOT_REF)):
2466 return unmemoize_atslot_ref (expr, env);
2467
2468 case (ISYMNUM (SCM_IM_SLOT_SET_X)):
2469 return unmemoize_atslot_set_x (expr, env);
2470
2471 case (ISYMNUM (SCM_IM_NIL_COND)):
2472 return unmemoize_exprs (expr, env); /* FIXME */
2473
2474 default:
2475 return unmemoize_exprs (expr, env); /* FIXME */
2476 }
2477 }
2478
2479
2480 /* scm_i_unmemocopy_expr and scm_i_unmemocopy_body take a memoized expression
2481 * respectively a memoized body together with its environment and rewrite it
2482 * to its original form. Thus, these functions are the inversion of the
2483 * rewrite rules above. The procedure is not optimized for speed. It's used
2484 * in scm_i_unmemoize_expr, scm_procedure_source, macro_print and scm_iprin1.
2485 *
2486 * Unmemoizing is not a reliable process. You cannot in general expect to get
2487 * the original source back.
2488 *
2489 * However, GOOPS currently relies on this for method compilation. This ought
2490 * to change. */
2491
2492 SCM
2493 scm_i_unmemocopy_expr (SCM expr, SCM env)
2494 {
2495 const SCM source_properties = scm_whash_lookup (scm_source_whash, expr);
2496 const SCM um_expr = unmemoize_expression (expr, env);
2497
2498 if (scm_is_true (source_properties))
2499 scm_whash_insert (scm_source_whash, um_expr, source_properties);
2500
2501 return um_expr;
2502 }
2503
2504 SCM
2505 scm_i_unmemocopy_body (SCM forms, SCM env)
2506 {
2507 const SCM source_properties = scm_whash_lookup (scm_source_whash, forms);
2508 const SCM um_forms = unmemoize_exprs (forms, env);
2509
2510 if (scm_is_true (source_properties))
2511 scm_whash_insert (scm_source_whash, um_forms, source_properties);
2512
2513 return um_forms;
2514 }
2515
2516
2517 #if (SCM_ENABLE_DEPRECATED == 1)
2518
2519 /* Deprecated in guile 1.7.0 on 2003-11-09. */
2520 SCM
2521 scm_m_expand_body (SCM exprs, SCM env)
2522 {
2523 scm_c_issue_deprecation_warning
2524 ("`scm_m_expand_body' is deprecated.");
2525 m_expand_body (exprs, env);
2526 return exprs;
2527 }
2528
2529
2530 SCM_SYNTAX (s_undefine, "undefine", scm_makacro, scm_m_undefine);
2531
2532 SCM
2533 scm_m_undefine (SCM expr, SCM env)
2534 {
2535 SCM variable;
2536 SCM location;
2537
2538 const SCM cdr_expr = SCM_CDR (expr);
2539 ASSERT_SYNTAX (SCM_TOP_LEVEL (env), "Bad undefine placement in", expr);
2540 ASSERT_SYNTAX (scm_ilength (cdr_expr) >= 0, s_bad_expression, expr);
2541 ASSERT_SYNTAX (scm_ilength (cdr_expr) == 1, s_expression, expr);
2542
2543 scm_c_issue_deprecation_warning
2544 ("`undefine' is deprecated.\n");
2545
2546 variable = SCM_CAR (cdr_expr);
2547 ASSERT_SYNTAX_2 (scm_is_symbol (variable), s_bad_variable, variable, expr);
2548 location = scm_sym2var (variable, scm_env_top_level (env), SCM_BOOL_F);
2549 ASSERT_SYNTAX_2 (scm_is_true (location)
2550 && !SCM_UNBNDP (SCM_VARIABLE_REF (location)),
2551 "variable already unbound ", variable, expr);
2552 SCM_VARIABLE_SET (location, SCM_UNDEFINED);
2553 return SCM_UNSPECIFIED;
2554 }
2555
2556 SCM
2557 scm_macroexp (SCM x, SCM env)
2558 {
2559 scm_c_issue_deprecation_warning
2560 ("`scm_macroexp' is deprecated.");
2561 return macroexp (x, env);
2562 }
2563
2564 #endif
2565
2566
2567 #if (SCM_ENABLE_DEPRECATED == 1)
2568
2569 SCM
2570 scm_unmemocar (SCM form, SCM env)
2571 {
2572 scm_c_issue_deprecation_warning
2573 ("`scm_unmemocar' is deprecated.");
2574
2575 if (!scm_is_pair (form))
2576 return form;
2577 else
2578 {
2579 SCM c = SCM_CAR (form);
2580 if (SCM_VARIABLEP (c))
2581 {
2582 SCM sym = scm_module_reverse_lookup (scm_env_module (env), c);
2583 if (scm_is_false (sym))
2584 sym = sym_three_question_marks;
2585 SCM_SETCAR (form, sym);
2586 }
2587 else if (SCM_ILOCP (c))
2588 {
2589 unsigned long int ir;
2590
2591 for (ir = SCM_IFRAME (c); ir != 0; --ir)
2592 env = SCM_CDR (env);
2593 env = SCM_CAAR (env);
2594 for (ir = SCM_IDIST (c); ir != 0; --ir)
2595 env = SCM_CDR (env);
2596
2597 SCM_SETCAR (form, SCM_ICDRP (c) ? env : SCM_CAR (env));
2598 }
2599 return form;
2600 }
2601 }
2602
2603 #endif
2604
2605 /*****************************************************************************/
2606 /*****************************************************************************/
2607 /* The definitions for execution start here. */
2608 /*****************************************************************************/
2609 /*****************************************************************************/
2610
2611 SCM_GLOBAL_SYMBOL (scm_sym_enter_frame, "enter-frame");
2612 SCM_GLOBAL_SYMBOL (scm_sym_apply_frame, "apply-frame");
2613 SCM_GLOBAL_SYMBOL (scm_sym_exit_frame, "exit-frame");
2614 SCM_GLOBAL_SYMBOL (scm_sym_memoize_symbol, "memoize-symbol");
2615 SCM_GLOBAL_SYMBOL (scm_sym_trace, "trace");
2616 SCM_SYMBOL (sym_instead, "instead");
2617
2618 /* A function object to implement "apply" for non-closure functions. */
2619 static SCM f_apply;
2620 /* An endless list consisting of #<undefined> objects: */
2621 static SCM undefineds;
2622
2623
2624 int
2625 scm_badargsp (SCM formals, SCM args)
2626 {
2627 while (!scm_is_null (formals))
2628 {
2629 if (!scm_is_pair (formals))
2630 return 0;
2631 if (scm_is_null (args))
2632 return 1;
2633 formals = SCM_CDR (formals);
2634 args = SCM_CDR (args);
2635 }
2636 return !scm_is_null (args) ? 1 : 0;
2637 }
2638
2639 \f
2640
2641 /* The evaluator contains a plethora of EVAL symbols.
2642 *
2643 *
2644 * SCM_I_EVALIM is used when it is known that the expression is an
2645 * immediate. (This macro never calls an evaluator.)
2646 *
2647 * SCM_I_XEVAL evaluates an expression that is expected to have its symbols already
2648 * memoized. Expressions that are not of the form '(<form> <form> ...)' are
2649 * evaluated inline without calling an evaluator.
2650 *
2651 * This macro uses ceval or deval depending on its 3rd argument.
2652 *
2653 * SCM_I_XEVALCAR evaluates the car of an expression 'X:(Y:<form> <form> ...)',
2654 * potentially replacing a symbol at the position Y:<form> by its memoized
2655 * variable. If Y:<form> is not of the form '(<form> <form> ...)', the
2656 * evaluation is performed inline without calling an evaluator.
2657 *
2658 * This macro uses ceval or deval depending on its 3rd argument.
2659 *
2660 */
2661
2662 #define SCM_I_EVALIM2(x) \
2663 ((scm_is_eq ((x), SCM_EOL) \
2664 ? syntax_error (s_empty_combination, (x), SCM_UNDEFINED), 0 \
2665 : 0), \
2666 (x))
2667
2668 #define SCM_I_EVALIM(x, env) (SCM_ILOCP (x) \
2669 ? *scm_ilookup ((x), (env)) \
2670 : SCM_I_EVALIM2(x))
2671
2672 #define SCM_I_XEVAL(x, env, debug_p) \
2673 (SCM_IMP (x) \
2674 ? SCM_I_EVALIM2 (x) \
2675 : (SCM_VARIABLEP (x) \
2676 ? SCM_VARIABLE_REF (x) \
2677 : (scm_is_pair (x) \
2678 ? (debug_p \
2679 ? deval ((x), (env)) \
2680 : ceval ((x), (env))) \
2681 : (x))))
2682
2683 #define SCM_I_XEVALCAR(x, env, debug_p) \
2684 (SCM_IMP (SCM_CAR (x)) \
2685 ? SCM_I_EVALIM (SCM_CAR (x), (env)) \
2686 : (SCM_VARIABLEP (SCM_CAR (x)) \
2687 ? SCM_VARIABLE_REF (SCM_CAR (x)) \
2688 : (scm_is_pair (SCM_CAR (x)) \
2689 ? (debug_p \
2690 ? deval (SCM_CAR (x), (env)) \
2691 : ceval (SCM_CAR (x), (env))) \
2692 : (!scm_is_symbol (SCM_CAR (x)) \
2693 ? SCM_CAR (x) \
2694 : *scm_lookupcar ((x), (env), 1)))))
2695
2696 scm_i_pthread_mutex_t source_mutex;
2697
2698
2699 /* Lookup a given local variable in an environment. The local variable is
2700 * given as an iloc, that is a triple <frame, binding, last?>, where frame
2701 * indicates the relative number of the environment frame (counting upwards
2702 * from the innermost environment frame), binding indicates the number of the
2703 * binding within the frame, and last? (which is extracted from the iloc using
2704 * the macro SCM_ICDRP) indicates whether the binding forms the binding at the
2705 * very end of the improper list of bindings. */
2706 SCM *
2707 scm_ilookup (SCM iloc, SCM env)
2708 {
2709 unsigned int frame_nr = SCM_IFRAME (iloc);
2710 unsigned int binding_nr = SCM_IDIST (iloc);
2711 SCM frames = env;
2712 SCM bindings;
2713
2714 for (; 0 != frame_nr; --frame_nr)
2715 frames = SCM_CDR (frames);
2716
2717 bindings = SCM_CAR (frames);
2718 for (; 0 != binding_nr; --binding_nr)
2719 bindings = SCM_CDR (bindings);
2720
2721 if (SCM_ICDRP (iloc))
2722 return SCM_CDRLOC (bindings);
2723 return SCM_CARLOC (SCM_CDR (bindings));
2724 }
2725
2726
2727 SCM_SYMBOL (scm_unbound_variable_key, "unbound-variable");
2728
2729 /* Call this for variables that are unfound.
2730 */
2731 static void
2732 error_unbound_variable (SCM symbol)
2733 {
2734 scm_error (scm_unbound_variable_key, NULL,
2735 "Unbound variable: ~S",
2736 scm_list_1 (symbol), SCM_BOOL_F);
2737 }
2738
2739 /* Call this for variables that are found but contain SCM_UNDEFINED.
2740 */
2741 static void
2742 error_defined_variable (SCM symbol)
2743 {
2744 /* We use the 'unbound-variable' key here as well, since it
2745 basically is the same kind of error, with a slight variation in
2746 the displayed message.
2747 */
2748 scm_error (scm_unbound_variable_key, NULL,
2749 "Variable used before given a value: ~S",
2750 scm_list_1 (symbol), SCM_BOOL_F);
2751 }
2752
2753
2754 /* The Lookup Car Race
2755 - by Eva Luator
2756
2757 Memoization of variables and special forms is done while executing
2758 the code for the first time. As long as there is only one thread
2759 everything is fine, but as soon as two threads execute the same
2760 code concurrently `for the first time' they can come into conflict.
2761
2762 This memoization includes rewriting variable references into more
2763 efficient forms and expanding macros. Furthermore, macro expansion
2764 includes `compiling' special forms like `let', `cond', etc. into
2765 tree-code instructions.
2766
2767 There shouldn't normally be a problem with memoizing local and
2768 global variable references (into ilocs and variables), because all
2769 threads will mutate the code in *exactly* the same way and (if I
2770 read the C code correctly) it is not possible to observe a half-way
2771 mutated cons cell. The lookup procedure can handle this
2772 transparently without any critical sections.
2773
2774 It is different with macro expansion, because macro expansion
2775 happens outside of the lookup procedure and can't be
2776 undone. Therefore the lookup procedure can't cope with it. It has
2777 to indicate failure when it detects a lost race and hope that the
2778 caller can handle it. Luckily, it turns out that this is the case.
2779
2780 An example to illustrate this: Suppose that the following form will
2781 be memoized concurrently by two threads
2782
2783 (let ((x 12)) x)
2784
2785 Let's first examine the lookup of X in the body. The first thread
2786 decides that it has to find the symbol "x" in the environment and
2787 starts to scan it. Then the other thread takes over and actually
2788 overtakes the first. It looks up "x" and substitutes an
2789 appropriate iloc for it. Now the first thread continues and
2790 completes its lookup. It comes to exactly the same conclusions as
2791 the second one and could - without much ado - just overwrite the
2792 iloc with the same iloc.
2793
2794 But let's see what will happen when the race occurs while looking
2795 up the symbol "let" at the start of the form. It could happen that
2796 the second thread interrupts the lookup of the first thread and not
2797 only substitutes a variable for it but goes right ahead and
2798 replaces it with the compiled form (#@let* (x 12) x). Now, when
2799 the first thread completes its lookup, it would replace the #@let*
2800 with a variable containing the "let" binding, effectively reverting
2801 the form to (let (x 12) x). This is wrong. It has to detect that
2802 it has lost the race and the evaluator has to reconsider the
2803 changed form completely.
2804
2805 This race condition could be resolved with some kind of traffic
2806 light (like mutexes) around scm_lookupcar, but I think that it is
2807 best to avoid them in this case. They would serialize memoization
2808 completely and because lookup involves calling arbitrary Scheme
2809 code (via the lookup-thunk), threads could be blocked for an
2810 arbitrary amount of time or even deadlock. But with the current
2811 solution a lot of unnecessary work is potentially done. */
2812
2813 /* SCM_LOOKUPCAR1 is what SCM_LOOKUPCAR used to be but is allowed to
2814 return NULL to indicate a failed lookup due to some race conditions
2815 between threads. This only happens when VLOC is the first cell of
2816 a special form that will eventually be memoized (like `let', etc.)
2817 In that case the whole lookup is bogus and the caller has to
2818 reconsider the complete special form.
2819
2820 SCM_LOOKUPCAR is still there, of course. It just calls
2821 SCM_LOOKUPCAR1 and aborts on receiving NULL. So SCM_LOOKUPCAR
2822 should only be called when it is known that VLOC is not the first
2823 pair of a special form. Otherwise, use SCM_LOOKUPCAR1 and check
2824 for NULL. I think I've found the only places where this
2825 applies. */
2826
2827 static SCM *
2828 scm_lookupcar1 (SCM vloc, SCM genv, int check)
2829 {
2830 SCM env = genv;
2831 register SCM *al, fl, var = SCM_CAR (vloc);
2832 register SCM iloc = SCM_ILOC00;
2833 for (; SCM_NIMP (env); env = SCM_CDR (env))
2834 {
2835 if (!scm_is_pair (SCM_CAR (env)))
2836 break;
2837 al = SCM_CARLOC (env);
2838 for (fl = SCM_CAR (*al); SCM_NIMP (fl); fl = SCM_CDR (fl))
2839 {
2840 if (!scm_is_pair (fl))
2841 {
2842 if (scm_is_eq (fl, var))
2843 {
2844 if (!scm_is_eq (SCM_CAR (vloc), var))
2845 goto race;
2846 SCM_SET_CELL_WORD_0 (vloc, SCM_UNPACK (iloc) + SCM_ICDR);
2847 return SCM_CDRLOC (*al);
2848 }
2849 else
2850 break;
2851 }
2852 al = SCM_CDRLOC (*al);
2853 if (scm_is_eq (SCM_CAR (fl), var))
2854 {
2855 if (SCM_UNBNDP (SCM_CAR (*al)))
2856 error_defined_variable (var);
2857 if (!scm_is_eq (SCM_CAR (vloc), var))
2858 goto race;
2859 SCM_SETCAR (vloc, iloc);
2860 return SCM_CARLOC (*al);
2861 }
2862 iloc = SCM_PACK (SCM_UNPACK (iloc) + SCM_IDINC);
2863 }
2864 iloc = SCM_PACK ((~SCM_IDSTMSK) & (SCM_UNPACK(iloc) + SCM_IFRINC));
2865 }
2866 {
2867 SCM top_thunk, real_var;
2868 if (SCM_NIMP (env))
2869 {
2870 top_thunk = SCM_CAR (env); /* env now refers to a
2871 top level env thunk */
2872 env = SCM_CDR (env);
2873 }
2874 else
2875 top_thunk = SCM_BOOL_F;
2876 real_var = scm_sym2var (var, top_thunk, SCM_BOOL_F);
2877 if (scm_is_false (real_var))
2878 goto errout;
2879
2880 if (!scm_is_null (env) || SCM_UNBNDP (SCM_VARIABLE_REF (real_var)))
2881 {
2882 errout:
2883 if (check)
2884 {
2885 if (scm_is_null (env))
2886 error_unbound_variable (var);
2887 else
2888 scm_misc_error (NULL, "Damaged environment: ~S",
2889 scm_list_1 (var));
2890 }
2891 else
2892 {
2893 /* A variable could not be found, but we shall
2894 not throw an error. */
2895 static SCM undef_object = SCM_UNDEFINED;
2896 return &undef_object;
2897 }
2898 }
2899
2900 if (!scm_is_eq (SCM_CAR (vloc), var))
2901 {
2902 /* Some other thread has changed the very cell we are working
2903 on. In effect, it must have done our job or messed it up
2904 completely. */
2905 race:
2906 var = SCM_CAR (vloc);
2907 if (SCM_VARIABLEP (var))
2908 return SCM_VARIABLE_LOC (var);
2909 if (SCM_ILOCP (var))
2910 return scm_ilookup (var, genv);
2911 /* We can't cope with anything else than variables and ilocs. When
2912 a special form has been memoized (i.e. `let' into `#@let') we
2913 return NULL and expect the calling function to do the right
2914 thing. For the evaluator, this means going back and redoing
2915 the dispatch on the car of the form. */
2916 return NULL;
2917 }
2918
2919 SCM_SETCAR (vloc, real_var);
2920 return SCM_VARIABLE_LOC (real_var);
2921 }
2922 }
2923
2924 SCM *
2925 scm_lookupcar (SCM vloc, SCM genv, int check)
2926 {
2927 SCM *loc = scm_lookupcar1 (vloc, genv, check);
2928 if (loc == NULL)
2929 abort ();
2930 return loc;
2931 }
2932
2933
2934 /* During execution, look up a symbol in the top level of the given local
2935 * environment and return the corresponding variable object. If no binding
2936 * for the symbol can be found, an 'Unbound variable' error is signalled. */
2937 static SCM
2938 lazy_memoize_variable (const SCM symbol, const SCM environment)
2939 {
2940 const SCM top_level = scm_env_top_level (environment);
2941 const SCM variable = scm_sym2var (symbol, top_level, SCM_BOOL_F);
2942
2943 if (scm_is_false (variable))
2944 error_unbound_variable (symbol);
2945 else
2946 return variable;
2947 }
2948
2949
2950 SCM
2951 scm_eval_car (SCM pair, SCM env)
2952 {
2953 return SCM_I_XEVALCAR (pair, env, scm_debug_mode_p);
2954 }
2955
2956
2957 SCM
2958 scm_eval_body (SCM code, SCM env)
2959 {
2960 SCM next;
2961
2962 again:
2963 next = SCM_CDR (code);
2964 while (!scm_is_null (next))
2965 {
2966 if (SCM_IMP (SCM_CAR (code)))
2967 {
2968 if (SCM_ISYMP (SCM_CAR (code)))
2969 {
2970 scm_dynwind_begin (0);
2971 scm_i_dynwind_pthread_mutex_lock (&source_mutex);
2972 /* check for race condition */
2973 if (SCM_ISYMP (SCM_CAR (code)))
2974 m_expand_body (code, env);
2975 scm_dynwind_end ();
2976 goto again;
2977 }
2978 }
2979 else
2980 SCM_I_XEVAL (SCM_CAR (code), env, scm_debug_mode_p);
2981 code = next;
2982 next = SCM_CDR (code);
2983 }
2984 return SCM_I_XEVALCAR (code, env, scm_debug_mode_p);
2985 }
2986
2987
2988 /* scm_last_debug_frame contains a pointer to the last debugging information
2989 * stack frame. It is accessed very often from the debugging evaluator, so it
2990 * should probably not be indirectly addressed. Better to save and restore it
2991 * from the current root at any stack swaps.
2992 */
2993
2994 /* scm_debug_eframe_size is the number of slots available for pseudo
2995 * stack frames at each real stack frame.
2996 */
2997
2998 long scm_debug_eframe_size;
2999
3000 int scm_debug_mode_p;
3001 int scm_check_entry_p;
3002 int scm_check_apply_p;
3003 int scm_check_exit_p;
3004 int scm_check_memoize_p;
3005
3006 long scm_eval_stack;
3007
3008 scm_t_option scm_eval_opts[] = {
3009 { SCM_OPTION_INTEGER, "stack", 22000, "Size of thread stacks (in machine words)." },
3010 { 0 }
3011 };
3012
3013 scm_t_option scm_debug_opts[] = {
3014 { SCM_OPTION_BOOLEAN, "cheap", 1,
3015 "*This option is now obsolete. Setting it has no effect." },
3016 { SCM_OPTION_BOOLEAN, "breakpoints", 0, "*Check for breakpoints." },
3017 { SCM_OPTION_BOOLEAN, "trace", 0, "*Trace mode." },
3018 { SCM_OPTION_BOOLEAN, "procnames", 1,
3019 "Record procedure names at definition." },
3020 { SCM_OPTION_BOOLEAN, "backwards", 0,
3021 "Display backtrace in anti-chronological order." },
3022 { SCM_OPTION_INTEGER, "width", 79, "Maximal width of backtrace." },
3023 { SCM_OPTION_INTEGER, "indent", 10, "Maximal indentation in backtrace." },
3024 { SCM_OPTION_INTEGER, "frames", 3,
3025 "Maximum number of tail-recursive frames in backtrace." },
3026 { SCM_OPTION_INTEGER, "maxdepth", 1000,
3027 "Maximal number of stored backtrace frames." },
3028 { SCM_OPTION_INTEGER, "depth", 20, "Maximal length of printed backtrace." },
3029 { SCM_OPTION_BOOLEAN, "backtrace", 0, "Show backtrace on error." },
3030 { SCM_OPTION_BOOLEAN, "debug", 0, "Use the debugging evaluator." },
3031
3032 { SCM_OPTION_INTEGER, "stack", 40000, "Stack size limit (measured in words; 0 = no check)." },
3033 { SCM_OPTION_SCM, "show-file-name", (unsigned long)SCM_BOOL_T,
3034 "Show file names and line numbers "
3035 "in backtraces when not `#f'. A value of `base' "
3036 "displays only base names, while `#t' displays full names."},
3037 { SCM_OPTION_BOOLEAN, "warn-deprecated", 0,
3038 "Warn when deprecated features are used." },
3039 { 0 },
3040 };
3041
3042
3043 /*
3044 * this ordering is awkward and illogical, but we maintain it for
3045 * compatibility. --hwn
3046 */
3047 scm_t_option scm_evaluator_trap_table[] = {
3048 { SCM_OPTION_BOOLEAN, "traps", 0, "Enable evaluator traps." },
3049 { SCM_OPTION_BOOLEAN, "enter-frame", 0, "Trap when eval enters new frame." },
3050 { SCM_OPTION_BOOLEAN, "apply-frame", 0, "Trap when entering apply." },
3051 { SCM_OPTION_BOOLEAN, "exit-frame", 0, "Trap when exiting eval or apply." },
3052 { SCM_OPTION_SCM, "enter-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for enter-frame traps." },
3053 { SCM_OPTION_SCM, "apply-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for apply-frame traps." },
3054 { SCM_OPTION_SCM, "exit-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for exit-frame traps." },
3055 { SCM_OPTION_BOOLEAN, "memoize-symbol", 0, "Trap when memoizing a symbol." },
3056 { SCM_OPTION_SCM, "memoize-symbol-handler", (unsigned long)SCM_BOOL_F, "The handler for memoization." },
3057 { 0 }
3058 };
3059
3060
3061 SCM_DEFINE (scm_eval_options_interface, "eval-options-interface", 0, 1, 0,
3062 (SCM setting),
3063 "Option interface for the evaluation options. Instead of using\n"
3064 "this procedure directly, use the procedures @code{eval-enable},\n"
3065 "@code{eval-disable}, @code{eval-set!} and @code{eval-options}.")
3066 #define FUNC_NAME s_scm_eval_options_interface
3067 {
3068 SCM ans;
3069
3070 scm_dynwind_begin (0);
3071 scm_dynwind_critical_section (SCM_BOOL_F);
3072 ans = scm_options (setting,
3073 scm_eval_opts,
3074 FUNC_NAME);
3075 scm_eval_stack = SCM_EVAL_STACK * sizeof (void *);
3076 scm_dynwind_end ();
3077
3078 return ans;
3079 }
3080 #undef FUNC_NAME
3081
3082
3083 SCM_DEFINE (scm_evaluator_traps, "evaluator-traps-interface", 0, 1, 0,
3084 (SCM setting),
3085 "Option interface for the evaluator trap options.")
3086 #define FUNC_NAME s_scm_evaluator_traps
3087 {
3088 SCM ans;
3089
3090
3091 scm_options_try (setting,
3092 scm_evaluator_trap_table,
3093 FUNC_NAME, 1);
3094 SCM_CRITICAL_SECTION_START;
3095 ans = scm_options (setting,
3096 scm_evaluator_trap_table,
3097 FUNC_NAME);
3098
3099 /* njrev: same again. */
3100 SCM_RESET_DEBUG_MODE;
3101 SCM_CRITICAL_SECTION_END;
3102 return ans;
3103 }
3104 #undef FUNC_NAME
3105
3106
3107
3108 \f
3109
3110 /* Simple procedure calls
3111 */
3112
3113 SCM
3114 scm_call_0 (SCM proc)
3115 {
3116 if (SCM_PROGRAM_P (proc))
3117 return scm_c_vm_run (scm_the_vm (), proc, NULL, 0);
3118 else
3119 return scm_apply (proc, SCM_EOL, SCM_EOL);
3120 }
3121
3122 SCM
3123 scm_call_1 (SCM proc, SCM arg1)
3124 {
3125 if (SCM_PROGRAM_P (proc))
3126 return scm_c_vm_run (scm_the_vm (), proc, &arg1, 1);
3127 else
3128 return scm_apply (proc, arg1, scm_listofnull);
3129 }
3130
3131 SCM
3132 scm_call_2 (SCM proc, SCM arg1, SCM arg2)
3133 {
3134 if (SCM_PROGRAM_P (proc))
3135 {
3136 SCM args[] = { arg1, arg2 };
3137 return scm_c_vm_run (scm_the_vm (), proc, args, 2);
3138 }
3139 else
3140 return scm_apply (proc, arg1, scm_cons (arg2, scm_listofnull));
3141 }
3142
3143 SCM
3144 scm_call_3 (SCM proc, SCM arg1, SCM arg2, SCM arg3)
3145 {
3146 if (SCM_PROGRAM_P (proc))
3147 {
3148 SCM args[] = { arg1, arg2, arg3 };
3149 return scm_c_vm_run (scm_the_vm (), proc, args, 3);
3150 }
3151 else
3152 return scm_apply (proc, arg1, scm_cons2 (arg2, arg3, scm_listofnull));
3153 }
3154
3155 SCM
3156 scm_call_4 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4)
3157 {
3158 if (SCM_PROGRAM_P (proc))
3159 {
3160 SCM args[] = { arg1, arg2, arg3, arg4 };
3161 return scm_c_vm_run (scm_the_vm (), proc, args, 4);
3162 }
3163 else
3164 return scm_apply (proc, arg1, scm_cons2 (arg2, arg3,
3165 scm_cons (arg4, scm_listofnull)));
3166 }
3167
3168 /* Simple procedure applies
3169 */
3170
3171 SCM
3172 scm_apply_0 (SCM proc, SCM args)
3173 {
3174 return scm_apply (proc, args, SCM_EOL);
3175 }
3176
3177 SCM
3178 scm_apply_1 (SCM proc, SCM arg1, SCM args)
3179 {
3180 return scm_apply (proc, scm_cons (arg1, args), SCM_EOL);
3181 }
3182
3183 SCM
3184 scm_apply_2 (SCM proc, SCM arg1, SCM arg2, SCM args)
3185 {
3186 return scm_apply (proc, scm_cons2 (arg1, arg2, args), SCM_EOL);
3187 }
3188
3189 SCM
3190 scm_apply_3 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM args)
3191 {
3192 return scm_apply (proc, scm_cons (arg1, scm_cons2 (arg2, arg3, args)),
3193 SCM_EOL);
3194 }
3195
3196 /* This code processes the arguments to apply:
3197
3198 (apply PROC ARG1 ... ARGS)
3199
3200 Given a list (ARG1 ... ARGS), this function conses the ARG1
3201 ... arguments onto the front of ARGS, and returns the resulting
3202 list. Note that ARGS is a list; thus, the argument to this
3203 function is a list whose last element is a list.
3204
3205 Apply calls this function, and applies PROC to the elements of the
3206 result. apply:nconc2last takes care of building the list of
3207 arguments, given (ARG1 ... ARGS).
3208
3209 Rather than do new consing, apply:nconc2last destroys its argument.
3210 On that topic, this code came into my care with the following
3211 beautifully cryptic comment on that topic: "This will only screw
3212 you if you do (scm_apply scm_apply '( ... ))" If you know what
3213 they're referring to, send me a patch to this comment. */
3214
3215 SCM_DEFINE (scm_nconc2last, "apply:nconc2last", 1, 0, 0,
3216 (SCM lst),
3217 "Given a list (@var{arg1} @dots{} @var{args}), this function\n"
3218 "conses the @var{arg1} @dots{} arguments onto the front of\n"
3219 "@var{args}, and returns the resulting list. Note that\n"
3220 "@var{args} is a list; thus, the argument to this function is\n"
3221 "a list whose last element is a list.\n"
3222 "Note: Rather than do new consing, @code{apply:nconc2last}\n"
3223 "destroys its argument, so use with care.")
3224 #define FUNC_NAME s_scm_nconc2last
3225 {
3226 SCM *lloc;
3227 SCM_VALIDATE_NONEMPTYLIST (1, lst);
3228 lloc = &lst;
3229 while (!scm_is_null (SCM_CDR (*lloc))) /* Perhaps should be
3230 SCM_NULL_OR_NIL_P, but not
3231 needed in 99.99% of cases,
3232 and it could seriously hurt
3233 performance. - Neil */
3234 lloc = SCM_CDRLOC (*lloc);
3235 SCM_ASSERT (scm_ilength (SCM_CAR (*lloc)) >= 0, lst, SCM_ARG1, FUNC_NAME);
3236 *lloc = SCM_CAR (*lloc);
3237 return lst;
3238 }
3239 #undef FUNC_NAME
3240
3241
3242
3243 /* SECTION: The rest of this file is only read once.
3244 */
3245
3246 /* Trampolines
3247 *
3248 * Trampolines make it possible to move procedure application dispatch
3249 * outside inner loops. The motivation was clean implementation of
3250 * efficient replacements of R5RS primitives in SRFI-1.
3251 *
3252 * The semantics is clear: scm_trampoline_N returns an optimized
3253 * version of scm_call_N (or NULL if the procedure isn't applicable
3254 * on N args).
3255 *
3256 * Applying the optimization to map and for-each increased efficiency
3257 * noticeably. For example, (map abs ls) is now 8 times faster than
3258 * before.
3259 */
3260
3261 static SCM
3262 call_subr0_0 (SCM proc)
3263 {
3264 return SCM_SUBRF (proc) ();
3265 }
3266
3267 static SCM
3268 call_subr1o_0 (SCM proc)
3269 {
3270 return SCM_SUBRF (proc) (SCM_UNDEFINED);
3271 }
3272
3273 static SCM
3274 call_lsubr_0 (SCM proc)
3275 {
3276 return SCM_SUBRF (proc) (SCM_EOL);
3277 }
3278
3279 SCM
3280 scm_i_call_closure_0 (SCM proc)
3281 {
3282 const SCM env = SCM_EXTEND_ENV (SCM_CLOSURE_FORMALS (proc),
3283 SCM_EOL,
3284 SCM_ENV (proc));
3285 const SCM result = scm_eval_body (SCM_CLOSURE_BODY (proc), env);
3286 return result;
3287 }
3288
3289 scm_t_trampoline_0
3290 scm_trampoline_0 (SCM proc)
3291 {
3292 scm_t_trampoline_0 trampoline;
3293
3294 if (SCM_IMP (proc))
3295 return NULL;
3296
3297 switch (SCM_TYP7 (proc))
3298 {
3299 case scm_tc7_subr_0:
3300 trampoline = call_subr0_0;
3301 break;
3302 case scm_tc7_subr_1o:
3303 trampoline = call_subr1o_0;
3304 break;
3305 case scm_tc7_lsubr:
3306 trampoline = call_lsubr_0;
3307 break;
3308 case scm_tcs_closures:
3309 {
3310 SCM formals = SCM_CLOSURE_FORMALS (proc);
3311 if (scm_is_null (formals) || !scm_is_pair (formals))
3312 trampoline = scm_i_call_closure_0;
3313 else
3314 return NULL;
3315 break;
3316 }
3317 case scm_tcs_struct:
3318 if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
3319 trampoline = scm_call_generic_0;
3320 else if (SCM_I_OPERATORP (proc))
3321 trampoline = scm_call_0;
3322 else
3323 return NULL;
3324 break;
3325 case scm_tc7_smob:
3326 if (SCM_SMOB_APPLICABLE_P (proc))
3327 trampoline = SCM_SMOB_DESCRIPTOR (proc).apply_0;
3328 else
3329 return NULL;
3330 break;
3331 case scm_tc7_asubr:
3332 case scm_tc7_rpsubr:
3333 case scm_tc7_gsubr:
3334 case scm_tc7_pws:
3335 trampoline = scm_call_0;
3336 break;
3337 default:
3338 return NULL; /* not applicable on zero arguments */
3339 }
3340 /* We only reach this point if a valid trampoline was determined. */
3341
3342 /* If debugging is enabled, we want to see all calls to proc on the stack.
3343 * Thus, we replace the trampoline shortcut with scm_call_0. */
3344 if (scm_debug_mode_p)
3345 return scm_call_0;
3346 else
3347 return trampoline;
3348 }
3349
3350 static SCM
3351 call_subr1_1 (SCM proc, SCM arg1)
3352 {
3353 return SCM_SUBRF (proc) (arg1);
3354 }
3355
3356 static SCM
3357 call_subr2o_1 (SCM proc, SCM arg1)
3358 {
3359 return SCM_SUBRF (proc) (arg1, SCM_UNDEFINED);
3360 }
3361
3362 static SCM
3363 call_lsubr_1 (SCM proc, SCM arg1)
3364 {
3365 return SCM_SUBRF (proc) (scm_list_1 (arg1));
3366 }
3367
3368 static SCM
3369 call_dsubr_1 (SCM proc, SCM arg1)
3370 {
3371 if (SCM_I_INUMP (arg1))
3372 {
3373 return (scm_from_double (SCM_DSUBRF (proc) ((double) SCM_I_INUM (arg1))));
3374 }
3375 else if (SCM_REALP (arg1))
3376 {
3377 return (scm_from_double (SCM_DSUBRF (proc) (SCM_REAL_VALUE (arg1))));
3378 }
3379 else if (SCM_BIGP (arg1))
3380 {
3381 return (scm_from_double (SCM_DSUBRF (proc) (scm_i_big2dbl (arg1))));
3382 }
3383 else if (SCM_FRACTIONP (arg1))
3384 {
3385 return (scm_from_double (SCM_DSUBRF (proc) (scm_i_fraction2double (arg1))));
3386 }
3387 SCM_WTA_DISPATCH_1 (*SCM_SUBR_GENERIC (proc), arg1,
3388 SCM_ARG1, scm_i_symbol_chars (SCM_SNAME (proc)));
3389 }
3390
3391 static SCM
3392 call_cxr_1 (SCM proc, SCM arg1)
3393 {
3394 return scm_i_chase_pairs (arg1, (scm_t_bits) SCM_SUBRF (proc));
3395 }
3396
3397 static SCM
3398 call_closure_1 (SCM proc, SCM arg1)
3399 {
3400 const SCM env = SCM_EXTEND_ENV (SCM_CLOSURE_FORMALS (proc),
3401 scm_list_1 (arg1),
3402 SCM_ENV (proc));
3403 const SCM result = scm_eval_body (SCM_CLOSURE_BODY (proc), env);
3404 return result;
3405 }
3406
3407 scm_t_trampoline_1
3408 scm_trampoline_1 (SCM proc)
3409 {
3410 scm_t_trampoline_1 trampoline;
3411
3412 if (SCM_IMP (proc))
3413 return NULL;
3414
3415 switch (SCM_TYP7 (proc))
3416 {
3417 case scm_tc7_subr_1:
3418 case scm_tc7_subr_1o:
3419 trampoline = call_subr1_1;
3420 break;
3421 case scm_tc7_subr_2o:
3422 trampoline = call_subr2o_1;
3423 break;
3424 case scm_tc7_lsubr:
3425 trampoline = call_lsubr_1;
3426 break;
3427 case scm_tc7_dsubr:
3428 trampoline = call_dsubr_1;
3429 break;
3430 case scm_tc7_cxr:
3431 trampoline = call_cxr_1;
3432 break;
3433 case scm_tcs_closures:
3434 {
3435 SCM formals = SCM_CLOSURE_FORMALS (proc);
3436 if (!scm_is_null (formals)
3437 && (!scm_is_pair (formals) || !scm_is_pair (SCM_CDR (formals))))
3438 trampoline = call_closure_1;
3439 else
3440 return NULL;
3441 break;
3442 }
3443 case scm_tcs_struct:
3444 if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
3445 trampoline = scm_call_generic_1;
3446 else if (SCM_I_OPERATORP (proc))
3447 trampoline = scm_call_1;
3448 else
3449 return NULL;
3450 break;
3451 case scm_tc7_smob:
3452 if (SCM_SMOB_APPLICABLE_P (proc))
3453 trampoline = SCM_SMOB_DESCRIPTOR (proc).apply_1;
3454 else
3455 return NULL;
3456 break;
3457 case scm_tc7_asubr:
3458 case scm_tc7_rpsubr:
3459 case scm_tc7_gsubr:
3460 case scm_tc7_pws:
3461 trampoline = scm_call_1;
3462 break;
3463 default:
3464 return NULL; /* not applicable on one arg */
3465 }
3466 /* We only reach this point if a valid trampoline was determined. */
3467
3468 /* If debugging is enabled, we want to see all calls to proc on the stack.
3469 * Thus, we replace the trampoline shortcut with scm_call_1. */
3470 if (scm_debug_mode_p)
3471 return scm_call_1;
3472 else
3473 return trampoline;
3474 }
3475
3476 static SCM
3477 call_subr2_2 (SCM proc, SCM arg1, SCM arg2)
3478 {
3479 return SCM_SUBRF (proc) (arg1, arg2);
3480 }
3481
3482 static SCM
3483 call_lsubr2_2 (SCM proc, SCM arg1, SCM arg2)
3484 {
3485 return SCM_SUBRF (proc) (arg1, arg2, SCM_EOL);
3486 }
3487
3488 static SCM
3489 call_lsubr_2 (SCM proc, SCM arg1, SCM arg2)
3490 {
3491 return SCM_SUBRF (proc) (scm_list_2 (arg1, arg2));
3492 }
3493
3494 static SCM
3495 call_closure_2 (SCM proc, SCM arg1, SCM arg2)
3496 {
3497 const SCM env = SCM_EXTEND_ENV (SCM_CLOSURE_FORMALS (proc),
3498 scm_list_2 (arg1, arg2),
3499 SCM_ENV (proc));
3500 const SCM result = scm_eval_body (SCM_CLOSURE_BODY (proc), env);
3501 return result;
3502 }
3503
3504 scm_t_trampoline_2
3505 scm_trampoline_2 (SCM proc)
3506 {
3507 scm_t_trampoline_2 trampoline;
3508
3509 if (SCM_IMP (proc))
3510 return NULL;
3511
3512 switch (SCM_TYP7 (proc))
3513 {
3514 case scm_tc7_subr_2:
3515 case scm_tc7_subr_2o:
3516 case scm_tc7_rpsubr:
3517 case scm_tc7_asubr:
3518 trampoline = call_subr2_2;
3519 break;
3520 case scm_tc7_lsubr_2:
3521 trampoline = call_lsubr2_2;
3522 break;
3523 case scm_tc7_lsubr:
3524 trampoline = call_lsubr_2;
3525 break;
3526 case scm_tcs_closures:
3527 {
3528 SCM formals = SCM_CLOSURE_FORMALS (proc);
3529 if (!scm_is_null (formals)
3530 && (!scm_is_pair (formals)
3531 || (!scm_is_null (SCM_CDR (formals))
3532 && (!scm_is_pair (SCM_CDR (formals))
3533 || !scm_is_pair (SCM_CDDR (formals))))))
3534 trampoline = call_closure_2;
3535 else
3536 return NULL;
3537 break;
3538 }
3539 case scm_tcs_struct:
3540 if (SCM_OBJ_CLASS_FLAGS (proc) & SCM_CLASSF_PURE_GENERIC)
3541 trampoline = scm_call_generic_2;
3542 else if (SCM_I_OPERATORP (proc))
3543 trampoline = scm_call_2;
3544 else
3545 return NULL;
3546 break;
3547 case scm_tc7_smob:
3548 if (SCM_SMOB_APPLICABLE_P (proc))
3549 trampoline = SCM_SMOB_DESCRIPTOR (proc).apply_2;
3550 else
3551 return NULL;
3552 break;
3553 case scm_tc7_gsubr:
3554 case scm_tc7_pws:
3555 trampoline = scm_call_2;
3556 break;
3557 default:
3558 return NULL; /* not applicable on two args */
3559 }
3560 /* We only reach this point if a valid trampoline was determined. */
3561
3562 /* If debugging is enabled, we want to see all calls to proc on the stack.
3563 * Thus, we replace the trampoline shortcut with scm_call_2. */
3564 if (scm_debug_mode_p)
3565 return scm_call_2;
3566 else
3567 return trampoline;
3568 }
3569
3570 /* Typechecking for multi-argument MAP and FOR-EACH.
3571
3572 Verify that each element of the vector ARGV, except for the first,
3573 is a proper list whose length is LEN. Attribute errors to WHO,
3574 and claim that the i'th element of ARGV is WHO's i+2'th argument. */
3575 static inline void
3576 check_map_args (SCM argv,
3577 long len,
3578 SCM gf,
3579 SCM proc,
3580 SCM args,
3581 const char *who)
3582 {
3583 long i;
3584
3585 for (i = SCM_SIMPLE_VECTOR_LENGTH (argv) - 1; i >= 1; i--)
3586 {
3587 SCM elt = SCM_SIMPLE_VECTOR_REF (argv, i);
3588 long elt_len = scm_ilength (elt);
3589
3590 if (elt_len < 0)
3591 {
3592 if (gf)
3593 scm_apply_generic (gf, scm_cons (proc, args));
3594 else
3595 scm_wrong_type_arg (who, i + 2, elt);
3596 }
3597
3598 if (elt_len != len)
3599 scm_out_of_range_pos (who, elt, scm_from_long (i + 2));
3600 }
3601 }
3602
3603
3604 SCM_GPROC (s_map, "map", 2, 0, 1, scm_map, g_map);
3605
3606 /* Note: Currently, scm_map applies PROC to the argument list(s)
3607 sequentially, starting with the first element(s). This is used in
3608 evalext.c where the Scheme procedure `map-in-order', which guarantees
3609 sequential behaviour, is implemented using scm_map. If the
3610 behaviour changes, we need to update `map-in-order'.
3611 */
3612
3613 SCM
3614 scm_map (SCM proc, SCM arg1, SCM args)
3615 #define FUNC_NAME s_map
3616 {
3617 long i, len;
3618 SCM res = SCM_EOL;
3619 SCM *pres = &res;
3620
3621 len = scm_ilength (arg1);
3622 SCM_GASSERTn (len >= 0,
3623 g_map, scm_cons2 (proc, arg1, args), SCM_ARG2, s_map);
3624 SCM_VALIDATE_REST_ARGUMENT (args);
3625 if (scm_is_null (args))
3626 {
3627 scm_t_trampoline_1 call = scm_trampoline_1 (proc);
3628 SCM_GASSERT2 (call, g_map, proc, arg1, SCM_ARG1, s_map);
3629 while (SCM_NIMP (arg1))
3630 {
3631 *pres = scm_list_1 (call (proc, SCM_CAR (arg1)));
3632 pres = SCM_CDRLOC (*pres);
3633 arg1 = SCM_CDR (arg1);
3634 }
3635 return res;
3636 }
3637 if (scm_is_null (SCM_CDR (args)))
3638 {
3639 SCM arg2 = SCM_CAR (args);
3640 int len2 = scm_ilength (arg2);
3641 scm_t_trampoline_2 call = scm_trampoline_2 (proc);
3642 SCM_GASSERTn (call,
3643 g_map, scm_cons2 (proc, arg1, args), SCM_ARG1, s_map);
3644 SCM_GASSERTn (len2 >= 0,
3645 g_map, scm_cons2 (proc, arg1, args), SCM_ARG3, s_map);
3646 if (len2 != len)
3647 SCM_OUT_OF_RANGE (3, arg2);
3648 while (SCM_NIMP (arg1))
3649 {
3650 *pres = scm_list_1 (call (proc, SCM_CAR (arg1), SCM_CAR (arg2)));
3651 pres = SCM_CDRLOC (*pres);
3652 arg1 = SCM_CDR (arg1);
3653 arg2 = SCM_CDR (arg2);
3654 }
3655 return res;
3656 }
3657 arg1 = scm_cons (arg1, args);
3658 args = scm_vector (arg1);
3659 check_map_args (args, len, g_map, proc, arg1, s_map);
3660 while (1)
3661 {
3662 arg1 = SCM_EOL;
3663 for (i = SCM_SIMPLE_VECTOR_LENGTH (args) - 1; i >= 0; i--)
3664 {
3665 SCM elt = SCM_SIMPLE_VECTOR_REF (args, i);
3666 if (SCM_IMP (elt))
3667 return res;
3668 arg1 = scm_cons (SCM_CAR (elt), arg1);
3669 SCM_SIMPLE_VECTOR_SET (args, i, SCM_CDR (elt));
3670 }
3671 *pres = scm_list_1 (scm_apply (proc, arg1, SCM_EOL));
3672 pres = SCM_CDRLOC (*pres);
3673 }
3674 }
3675 #undef FUNC_NAME
3676
3677
3678 SCM_GPROC (s_for_each, "for-each", 2, 0, 1, scm_for_each, g_for_each);
3679
3680 SCM
3681 scm_for_each (SCM proc, SCM arg1, SCM args)
3682 #define FUNC_NAME s_for_each
3683 {
3684 long i, len;
3685 len = scm_ilength (arg1);
3686 SCM_GASSERTn (len >= 0, g_for_each, scm_cons2 (proc, arg1, args),
3687 SCM_ARG2, s_for_each);
3688 SCM_VALIDATE_REST_ARGUMENT (args);
3689 if (scm_is_null (args))
3690 {
3691 scm_t_trampoline_1 call = scm_trampoline_1 (proc);
3692 SCM_GASSERT2 (call, g_for_each, proc, arg1, SCM_ARG1, s_for_each);
3693 while (SCM_NIMP (arg1))
3694 {
3695 call (proc, SCM_CAR (arg1));
3696 arg1 = SCM_CDR (arg1);
3697 }
3698 return SCM_UNSPECIFIED;
3699 }
3700 if (scm_is_null (SCM_CDR (args)))
3701 {
3702 SCM arg2 = SCM_CAR (args);
3703 int len2 = scm_ilength (arg2);
3704 scm_t_trampoline_2 call = scm_trampoline_2 (proc);
3705 SCM_GASSERTn (call, g_for_each,
3706 scm_cons2 (proc, arg1, args), SCM_ARG1, s_for_each);
3707 SCM_GASSERTn (len2 >= 0, g_for_each,
3708 scm_cons2 (proc, arg1, args), SCM_ARG3, s_for_each);
3709 if (len2 != len)
3710 SCM_OUT_OF_RANGE (3, arg2);
3711 while (SCM_NIMP (arg1))
3712 {
3713 call (proc, SCM_CAR (arg1), SCM_CAR (arg2));
3714 arg1 = SCM_CDR (arg1);
3715 arg2 = SCM_CDR (arg2);
3716 }
3717 return SCM_UNSPECIFIED;
3718 }
3719 arg1 = scm_cons (arg1, args);
3720 args = scm_vector (arg1);
3721 check_map_args (args, len, g_for_each, proc, arg1, s_for_each);
3722 while (1)
3723 {
3724 arg1 = SCM_EOL;
3725 for (i = SCM_SIMPLE_VECTOR_LENGTH (args) - 1; i >= 0; i--)
3726 {
3727 SCM elt = SCM_SIMPLE_VECTOR_REF (args, i);
3728 if (SCM_IMP (elt))
3729 return SCM_UNSPECIFIED;
3730 arg1 = scm_cons (SCM_CAR (elt), arg1);
3731 SCM_SIMPLE_VECTOR_SET (args, i, SCM_CDR (elt));
3732 }
3733 scm_apply (proc, arg1, SCM_EOL);
3734 }
3735 }
3736 #undef FUNC_NAME
3737
3738
3739 SCM
3740 scm_closure (SCM code, SCM env)
3741 {
3742 SCM z;
3743 SCM closcar = scm_cons (code, SCM_EOL);
3744 z = scm_cell (SCM_UNPACK (closcar) + scm_tc3_closure, (scm_t_bits) env);
3745 scm_remember_upto_here (closcar);
3746 return z;
3747 }
3748
3749
3750 scm_t_bits scm_tc16_promise;
3751
3752 SCM_DEFINE (scm_make_promise, "make-promise", 1, 0, 0,
3753 (SCM thunk),
3754 "Create a new promise object.\n\n"
3755 "@code{make-promise} is a procedural form of @code{delay}.\n"
3756 "These two expressions are equivalent:\n"
3757 "@lisp\n"
3758 "(delay @var{exp})\n"
3759 "(make-promise (lambda () @var{exp}))\n"
3760 "@end lisp\n")
3761 #define FUNC_NAME s_scm_make_promise
3762 {
3763 SCM_VALIDATE_THUNK (1, thunk);
3764 SCM_RETURN_NEWSMOB2 (scm_tc16_promise,
3765 SCM_UNPACK (thunk),
3766 scm_make_recursive_mutex ());
3767 }
3768 #undef FUNC_NAME
3769
3770 static SCM
3771 promise_mark (SCM promise)
3772 {
3773 scm_gc_mark (SCM_PROMISE_MUTEX (promise));
3774 return SCM_PROMISE_DATA (promise);
3775 }
3776
3777 static size_t
3778 promise_free (SCM promise)
3779 {
3780 return 0;
3781 }
3782
3783 static int
3784 promise_print (SCM exp, SCM port, scm_print_state *pstate)
3785 {
3786 int writingp = SCM_WRITINGP (pstate);
3787 scm_puts ("#<promise ", port);
3788 SCM_SET_WRITINGP (pstate, 1);
3789 scm_iprin1 (SCM_PROMISE_DATA (exp), port, pstate);
3790 SCM_SET_WRITINGP (pstate, writingp);
3791 scm_putc ('>', port);
3792 return !0;
3793 }
3794
3795 SCM_DEFINE (scm_force, "force", 1, 0, 0,
3796 (SCM promise),
3797 "If the promise @var{x} has not been computed yet, compute and\n"
3798 "return @var{x}, otherwise just return the previously computed\n"
3799 "value.")
3800 #define FUNC_NAME s_scm_force
3801 {
3802 SCM_VALIDATE_SMOB (1, promise, promise);
3803 scm_lock_mutex (SCM_PROMISE_MUTEX (promise));
3804 if (!SCM_PROMISE_COMPUTED_P (promise))
3805 {
3806 SCM ans = scm_call_0 (SCM_PROMISE_DATA (promise));
3807 if (!SCM_PROMISE_COMPUTED_P (promise))
3808 {
3809 SCM_SET_PROMISE_DATA (promise, ans);
3810 SCM_SET_PROMISE_COMPUTED (promise);
3811 }
3812 }
3813 scm_unlock_mutex (SCM_PROMISE_MUTEX (promise));
3814 return SCM_PROMISE_DATA (promise);
3815 }
3816 #undef FUNC_NAME
3817
3818
3819 SCM_DEFINE (scm_promise_p, "promise?", 1, 0, 0,
3820 (SCM obj),
3821 "Return true if @var{obj} is a promise, i.e. a delayed computation\n"
3822 "(@pxref{Delayed evaluation,,,r5rs.info,The Revised^5 Report on Scheme}).")
3823 #define FUNC_NAME s_scm_promise_p
3824 {
3825 return scm_from_bool (SCM_TYP16_PREDICATE (scm_tc16_promise, obj));
3826 }
3827 #undef FUNC_NAME
3828
3829
3830 SCM_DEFINE (scm_cons_source, "cons-source", 3, 0, 0,
3831 (SCM xorig, SCM x, SCM y),
3832 "Create and return a new pair whose car and cdr are @var{x} and @var{y}.\n"
3833 "Any source properties associated with @var{xorig} are also associated\n"
3834 "with the new pair.")
3835 #define FUNC_NAME s_scm_cons_source
3836 {
3837 SCM p, z;
3838 z = scm_cons (x, y);
3839 /* Copy source properties possibly associated with xorig. */
3840 p = scm_whash_lookup (scm_source_whash, xorig);
3841 if (scm_is_true (p))
3842 scm_whash_insert (scm_source_whash, z, p);
3843 return z;
3844 }
3845 #undef FUNC_NAME
3846
3847
3848 /* The function scm_copy_tree is used to copy an expression tree to allow the
3849 * memoizer to modify the expression during memoization. scm_copy_tree
3850 * creates deep copies of pairs and vectors, but not of any other data types,
3851 * since only pairs and vectors will be parsed by the memoizer.
3852 *
3853 * To avoid infinite recursion due to cyclic structures, the hare-and-tortoise
3854 * pattern is used to detect cycles. In fact, the pattern is used in two
3855 * dimensions, vertical (indicated in the code by the variable names 'hare'
3856 * and 'tortoise') and horizontal ('rabbit' and 'turtle'). In both
3857 * dimensions, the hare/rabbit will take two steps when the tortoise/turtle
3858 * takes one.
3859 *
3860 * The vertical dimension corresponds to recursive calls to function
3861 * copy_tree: This happens when descending into vector elements, into cars of
3862 * lists and into the cdr of an improper list. In this dimension, the
3863 * tortoise follows the hare by using the processor stack: Every stack frame
3864 * will hold an instance of struct t_trace. These instances are connected in
3865 * a way that represents the trace of the hare, which thus can be followed by
3866 * the tortoise. The tortoise will always point to struct t_trace instances
3867 * relating to SCM objects that have already been copied. Thus, a cycle is
3868 * detected if the tortoise and the hare point to the same object,
3869 *
3870 * The horizontal dimension is within one execution of copy_tree, when the
3871 * function cdr's along the pairs of a list. This is the standard
3872 * hare-and-tortoise implementation, found several times in guile. */
3873
3874 struct t_trace {
3875 struct t_trace *trace; /* These pointers form a trace along the stack. */
3876 SCM obj; /* The object handled at the respective stack frame.*/
3877 };
3878
3879 static SCM
3880 copy_tree (
3881 struct t_trace *const hare,
3882 struct t_trace *tortoise,
3883 unsigned int tortoise_delay )
3884 {
3885 if (!scm_is_pair (hare->obj) && !scm_is_simple_vector (hare->obj))
3886 {
3887 return hare->obj;
3888 }
3889 else
3890 {
3891 /* Prepare the trace along the stack. */
3892 struct t_trace new_hare;
3893 hare->trace = &new_hare;
3894
3895 /* The tortoise will make its step after the delay has elapsed. Note
3896 * that in contrast to the typical hare-and-tortoise pattern, the step
3897 * of the tortoise happens before the hare takes its steps. This is, in
3898 * principle, no problem, except for the start of the algorithm: Then,
3899 * it has to be made sure that the hare actually gets its advantage of
3900 * two steps. */
3901 if (tortoise_delay == 0)
3902 {
3903 tortoise_delay = 1;
3904 tortoise = tortoise->trace;
3905 ASSERT_SYNTAX (!scm_is_eq (hare->obj, tortoise->obj),
3906 s_bad_expression, hare->obj);
3907 }
3908 else
3909 {
3910 --tortoise_delay;
3911 }
3912
3913 if (scm_is_simple_vector (hare->obj))
3914 {
3915 size_t length = SCM_SIMPLE_VECTOR_LENGTH (hare->obj);
3916 SCM new_vector = scm_c_make_vector (length, SCM_UNSPECIFIED);
3917
3918 /* Each vector element is copied by recursing into copy_tree, having
3919 * the tortoise follow the hare into the depths of the stack. */
3920 unsigned long int i;
3921 for (i = 0; i < length; ++i)
3922 {
3923 SCM new_element;
3924 new_hare.obj = SCM_SIMPLE_VECTOR_REF (hare->obj, i);
3925 new_element = copy_tree (&new_hare, tortoise, tortoise_delay);
3926 SCM_SIMPLE_VECTOR_SET (new_vector, i, new_element);
3927 }
3928
3929 return new_vector;
3930 }
3931 else /* scm_is_pair (hare->obj) */
3932 {
3933 SCM result;
3934 SCM tail;
3935
3936 SCM rabbit = hare->obj;
3937 SCM turtle = hare->obj;
3938
3939 SCM copy;
3940
3941 /* The first pair of the list is treated specially, in order to
3942 * preserve a potential source code position. */
3943 result = tail = scm_cons_source (rabbit, SCM_EOL, SCM_EOL);
3944 new_hare.obj = SCM_CAR (rabbit);
3945 copy = copy_tree (&new_hare, tortoise, tortoise_delay);
3946 SCM_SETCAR (tail, copy);
3947
3948 /* The remaining pairs of the list are copied by, horizontally,
3949 * having the turtle follow the rabbit, and, vertically, having the
3950 * tortoise follow the hare into the depths of the stack. */
3951 rabbit = SCM_CDR (rabbit);
3952 while (scm_is_pair (rabbit))
3953 {
3954 new_hare.obj = SCM_CAR (rabbit);
3955 copy = copy_tree (&new_hare, tortoise, tortoise_delay);
3956 SCM_SETCDR (tail, scm_cons (copy, SCM_UNDEFINED));
3957 tail = SCM_CDR (tail);
3958
3959 rabbit = SCM_CDR (rabbit);
3960 if (scm_is_pair (rabbit))
3961 {
3962 new_hare.obj = SCM_CAR (rabbit);
3963 copy = copy_tree (&new_hare, tortoise, tortoise_delay);
3964 SCM_SETCDR (tail, scm_cons (copy, SCM_UNDEFINED));
3965 tail = SCM_CDR (tail);
3966 rabbit = SCM_CDR (rabbit);
3967
3968 turtle = SCM_CDR (turtle);
3969 ASSERT_SYNTAX (!scm_is_eq (rabbit, turtle),
3970 s_bad_expression, rabbit);
3971 }
3972 }
3973
3974 /* We have to recurse into copy_tree again for the last cdr, in
3975 * order to handle the situation that it holds a vector. */
3976 new_hare.obj = rabbit;
3977 copy = copy_tree (&new_hare, tortoise, tortoise_delay);
3978 SCM_SETCDR (tail, copy);
3979
3980 return result;
3981 }
3982 }
3983 }
3984
3985 SCM_DEFINE (scm_copy_tree, "copy-tree", 1, 0, 0,
3986 (SCM obj),
3987 "Recursively copy the data tree that is bound to @var{obj}, and return a\n"
3988 "the new data structure. @code{copy-tree} recurses down the\n"
3989 "contents of both pairs and vectors (since both cons cells and vector\n"
3990 "cells may point to arbitrary objects), and stops recursing when it hits\n"
3991 "any other object.")
3992 #define FUNC_NAME s_scm_copy_tree
3993 {
3994 /* Prepare the trace along the stack. */
3995 struct t_trace trace;
3996 trace.obj = obj;
3997
3998 /* In function copy_tree, if the tortoise makes its step, it will do this
3999 * before the hare has the chance to move. Thus, we have to make sure that
4000 * the very first step of the tortoise will not happen after the hare has
4001 * really made two steps. This is achieved by passing '2' as the initial
4002 * delay for the tortoise. NOTE: Since cycles are unlikely, giving the hare
4003 * a bigger advantage may improve performance slightly. */
4004 return copy_tree (&trace, &trace, 2);
4005 }
4006 #undef FUNC_NAME
4007
4008
4009 /* We have three levels of EVAL here:
4010
4011 - scm_i_eval (exp, env)
4012
4013 evaluates EXP in environment ENV. ENV is a lexical environment
4014 structure as used by the actual tree code evaluator. When ENV is
4015 a top-level environment, then changes to the current module are
4016 tracked by updating ENV so that it continues to be in sync with
4017 the current module.
4018
4019 - scm_primitive_eval (exp)
4020
4021 evaluates EXP in the top-level environment as determined by the
4022 current module. This is done by constructing a suitable
4023 environment and calling scm_i_eval. Thus, changes to the
4024 top-level module are tracked normally.
4025
4026 - scm_eval (exp, mod_or_state)
4027
4028 evaluates EXP while MOD_OR_STATE is the current module or current
4029 dynamic state (as appropriate). This is done by setting the
4030 current module (or dynamic state) to MOD_OR_STATE, invoking
4031 scm_primitive_eval on EXP, and then restoring the current module
4032 (or dynamic state) to the value it had previously. That is,
4033 while EXP is evaluated, changes to the current module (or dynamic
4034 state) are tracked, but these changes do not persist when
4035 scm_eval returns.
4036
4037 For each level of evals, there are two variants, distinguished by a
4038 _x suffix: the ordinary variant does not modify EXP while the _x
4039 variant can destructively modify EXP into something completely
4040 unintelligible. A Scheme data structure passed as EXP to one of the
4041 _x variants should not ever be used again for anything. So when in
4042 doubt, use the ordinary variant.
4043
4044 */
4045
4046 SCM
4047 scm_i_eval_x (SCM exp, SCM env)
4048 {
4049 if (scm_is_symbol (exp))
4050 return *scm_lookupcar (scm_cons (exp, SCM_UNDEFINED), env, 1);
4051 else
4052 return SCM_I_XEVAL (exp, env, scm_debug_mode_p);
4053 }
4054
4055 SCM
4056 scm_i_eval (SCM exp, SCM env)
4057 {
4058 exp = scm_copy_tree (exp);
4059 if (scm_is_symbol (exp))
4060 return *scm_lookupcar (scm_cons (exp, SCM_UNDEFINED), env, 1);
4061 else
4062 return SCM_I_XEVAL (exp, env, scm_debug_mode_p);
4063 }
4064
4065 SCM
4066 scm_primitive_eval_x (SCM exp)
4067 {
4068 SCM env;
4069 SCM transformer = scm_current_module_transformer ();
4070 if (SCM_NIMP (transformer))
4071 exp = scm_call_1 (transformer, exp);
4072 env = scm_top_level_env (scm_current_module_lookup_closure ());
4073 return scm_i_eval_x (exp, env);
4074 }
4075
4076 SCM_DEFINE (scm_primitive_eval, "primitive-eval", 1, 0, 0,
4077 (SCM exp),
4078 "Evaluate @var{exp} in the top-level environment specified by\n"
4079 "the current module.")
4080 #define FUNC_NAME s_scm_primitive_eval
4081 {
4082 SCM env;
4083 SCM transformer = scm_current_module_transformer ();
4084 if (scm_is_true (transformer))
4085 exp = scm_call_1 (transformer, exp);
4086 env = scm_top_level_env (scm_current_module_lookup_closure ());
4087 return scm_i_eval (exp, env);
4088 }
4089 #undef FUNC_NAME
4090
4091
4092 /* Eval does not take the second arg optionally. This is intentional
4093 * in order to be R5RS compatible, and to prepare for the new module
4094 * system, where we would like to make the choice of evaluation
4095 * environment explicit. */
4096
4097 SCM
4098 scm_eval_x (SCM exp, SCM module_or_state)
4099 {
4100 SCM res;
4101
4102 scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
4103 if (scm_is_dynamic_state (module_or_state))
4104 scm_dynwind_current_dynamic_state (module_or_state);
4105 else
4106 scm_dynwind_current_module (module_or_state);
4107
4108 res = scm_primitive_eval_x (exp);
4109
4110 scm_dynwind_end ();
4111 return res;
4112 }
4113
4114 SCM_DEFINE (scm_eval, "eval", 2, 0, 0,
4115 (SCM exp, SCM module_or_state),
4116 "Evaluate @var{exp}, a list representing a Scheme expression,\n"
4117 "in the top-level environment specified by\n"
4118 "@var{module_or_state}.\n"
4119 "While @var{exp} is evaluated (using @code{primitive-eval}),\n"
4120 "@var{module_or_state} is made the current module when\n"
4121 "it is a module, or the current dynamic state when it is\n"
4122 "a dynamic state."
4123 "Example: (eval '(+ 1 2) (interaction-environment))")
4124 #define FUNC_NAME s_scm_eval
4125 {
4126 SCM res;
4127
4128 scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
4129 if (scm_is_dynamic_state (module_or_state))
4130 scm_dynwind_current_dynamic_state (module_or_state);
4131 else if (scm_module_system_booted_p)
4132 {
4133 SCM_VALIDATE_MODULE (2, module_or_state);
4134 scm_dynwind_current_module (module_or_state);
4135 }
4136 /* otherwise if the module system isn't booted, ignore the module arg */
4137
4138 res = scm_primitive_eval (exp);
4139
4140 scm_dynwind_end ();
4141 return res;
4142 }
4143 #undef FUNC_NAME
4144
4145
4146 /* At this point, deval and scm_dapply are generated.
4147 */
4148
4149 #define DEVAL
4150 #include "eval.i.c"
4151 #undef DEVAL
4152 #include "eval.i.c"
4153
4154
4155 void
4156 scm_init_eval ()
4157 {
4158 scm_i_pthread_mutex_init (&source_mutex,
4159 scm_i_pthread_mutexattr_recursive);
4160
4161 scm_init_opts (scm_evaluator_traps,
4162 scm_evaluator_trap_table);
4163 scm_init_opts (scm_eval_options_interface,
4164 scm_eval_opts);
4165
4166 scm_tc16_promise = scm_make_smob_type ("promise", 0);
4167 scm_set_smob_mark (scm_tc16_promise, promise_mark);
4168 scm_set_smob_free (scm_tc16_promise, promise_free);
4169 scm_set_smob_print (scm_tc16_promise, promise_print);
4170
4171 undefineds = scm_list_1 (SCM_UNDEFINED);
4172 SCM_SETCDR (undefineds, undefineds);
4173 scm_permanent_object (undefineds);
4174
4175 scm_listofnull = scm_list_1 (SCM_EOL);
4176
4177 f_apply = scm_c_define_subr ("apply", scm_tc7_lsubr_2, scm_apply);
4178 scm_permanent_object (f_apply);
4179
4180 #include "libguile/eval.x"
4181
4182 scm_add_feature ("delay");
4183 }
4184
4185 /*
4186 Local Variables:
4187 c-file-style: "gnu"
4188 End:
4189 */
4190