- case SCM_EXPANDED_LETREC:
- {
- SCM vars, varsv, exps, expsv, body, undefs, new_env;
- int i, nvars, in_order_p;
-
- vars = REF (exp, LETREC, GENSYMS);
- exps = REF (exp, LETREC, VALS);
- body = REF (exp, LETREC, BODY);
- in_order_p = scm_is_true (REF (exp, LETREC, IN_ORDER_P));
-
- varsv = scm_vector (vars);
- nvars = VECTOR_LENGTH (varsv);
- expsv = scm_vector (exps);
-
- undefs = scm_c_make_vector (nvars, MAKMEMO_QUOTE (SCM_UNDEFINED));
- new_env = scm_cons (varsv, capture_env (env));
-
- if (in_order_p)
- {
- SCM body_exps = memoize (body, new_env);
- for (i = nvars - 1; i >= 0; i--)
- {
- SCM init = memoize (VECTOR_REF (expsv, i), new_env);
- body_exps = MAKMEMO_SEQ (MAKMEMO_LEX_SET (make_pos (0, i), init),
- body_exps);
- }
- return maybe_makmemo_capture_module
- (MAKMEMO_LET (undefs, body_exps), env);
- }
- else
- {
- SCM sets = SCM_BOOL_F, inits = scm_c_make_vector (nvars, SCM_BOOL_F);
- for (i = nvars - 1; i >= 0; i--)
- {
- SCM init, set;
-
- init = memoize (VECTOR_REF (expsv, i), new_env);
- VECTOR_SET (inits, i, init);
-
- set = MAKMEMO_LEX_SET (make_pos (1, i),
- MAKMEMO_LEX_REF (make_pos (0, i)));
- if (scm_is_false (sets))
- sets = set;
- else
- sets = MAKMEMO_SEQ (set, sets);
- }
-
- if (scm_is_false (sets))
- return memoize (body, env);
-
- return maybe_makmemo_capture_module
- (MAKMEMO_LET (undefs,
- MAKMEMO_SEQ (MAKMEMO_LET (inits, sets),
- memoize (body, new_env))),
- env);
- }
- }
-