summaryrefslogtreecommitdiff
path: root/libguile/expand.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/expand.c')
-rw-r--r--libguile/expand.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/libguile/expand.c b/libguile/expand.c
index 62e3acfb6..bdecd80d8 100644
--- a/libguile/expand.c
+++ b/libguile/expand.c
@@ -163,6 +163,7 @@ SCM_SYNTAX ("set!", expand_set_x);
SCM_SYNTAX ("and", expand_and);
SCM_SYNTAX ("cond", expand_cond);
SCM_SYNTAX ("letrec", expand_letrec);
+SCM_SYNTAX ("letrec*", expand_letrec_star);
SCM_SYNTAX ("let*", expand_letstar);
SCM_SYNTAX ("or", expand_or);
SCM_SYNTAX ("lambda*", expand_lambda_star);
@@ -1030,7 +1031,7 @@ expand_let (SCM expr, SCM env)
}
static SCM
-expand_letrec (SCM expr, SCM env)
+expand_letrec_helper (SCM expr, SCM env, SCM in_order_p)
{
SCM bindings;
@@ -1048,13 +1049,25 @@ expand_letrec (SCM expr, SCM env)
SCM var_names, var_syms, inits;
transform_bindings (bindings, expr, &var_names, &var_syms, &inits);
env = expand_env_extend (env, var_names, var_syms);
- return LETREC (SCM_BOOL_F, SCM_BOOL_F,
+ return LETREC (SCM_BOOL_F, in_order_p,
var_names, var_syms, expand_exprs (inits, env),
expand_sequence (CDDR (expr), env));
}
}
static SCM
+expand_letrec (SCM expr, SCM env)
+{
+ return expand_letrec_helper (expr, env, SCM_BOOL_F);
+}
+
+static SCM
+expand_letrec_star (SCM expr, SCM env)
+{
+ return expand_letrec_helper (expr, env, SCM_BOOL_T);
+}
+
+static SCM
expand_letstar_clause (SCM bindings, SCM body, SCM env SCM_UNUSED)
{
if (scm_is_null (bindings))