Neil Jerram wrote: > > Yes, I'll have a go. How about the attached? The scm_reverse_x is annoying, but removing it would require
- either modifying transform_bindings etc. so as not to reverse things in the first place, or so as to reverse the init vars in the same way as the init forms - or constructing the list backwards in eval_letrec_inits - but I can't see a way of doing that. Neil
Index: eval.c =================================================================== RCS file: /cvsroot/guile/guile/guile-core/libguile/eval.c,v retrieving revision 1.397 diff -u -r1.397 eval.c --- eval.c 6 Jun 2005 18:49:55 -0000 1.397 +++ eval.c 12 Jun 2005 09:30:14 -0000 @@ -96,6 +96,7 @@ static SCM canonicalize_define (SCM expr); static SCM *scm_lookupcar1 (SCM vloc, SCM genv, int check); static SCM unmemoize_builtin_macro (SCM expr, SCM env); +static SCM eval_letrec_inits (SCM env, SCM init_forms, SCM init_values); @@ -3148,6 +3149,29 @@ return *results; } +static SCM +eval_letrec_inits (SCM env, SCM init_forms, SCM init_values) +{ + SCM argv[10]; + int i = 0, imax = sizeof (argv) / sizeof (SCM); + + while (!scm_is_null (init_forms)) + { + if (imax == i) + { + init_values = eval_letrec_inits (env, init_forms, init_values); + break; + } + argv[i++] = EVALCAR (init_forms, env); + init_forms = SCM_CDR (init_forms); + } + + for (i--; i >= 0; i--) + init_values = scm_cons (argv[i], init_values); + + return init_values; +} + #endif /* !DEVAL */ @@ -3563,21 +3587,9 @@ x = SCM_CDR (x); { SCM init_forms = SCM_CAR (x); - SCM init_values = SCM_EOL; - do - { - init_values = scm_cons (EVALCAR (init_forms, env), init_values); - init_forms = SCM_CDR (init_forms); - } - while (!scm_is_null (init_forms)); - - /* In order to make case 1.1 of the R5RS pitfall testsuite - succeed, we would need to copy init_values here like - so: - - init_values = scm_list_copy (init_values); - */ - SCM_SETCDR (SCM_CAR (env), init_values); + SCM init_values = eval_letrec_inits (env, init_forms, SCM_EOL); + SCM_SETCDR (SCM_CAR (env), + scm_reverse_x (init_values, SCM_UNDEFINED)); } x = SCM_CDR (x); PREP_APPLY (SCM_UNDEFINED, SCM_EOL);
_______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://lists.gnu.org/mailman/listinfo/guile-devel