summaryrefslogtreecommitdiff
path: root/libguile/memoize.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/memoize.c')
-rw-r--r--libguile/memoize.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/libguile/memoize.c b/libguile/memoize.c
index 87375f790..2cfb0cb00 100644
--- a/libguile/memoize.c
+++ b/libguile/memoize.c
@@ -183,9 +183,9 @@ scm_t_bits scm_tc16_memoized;
scm_list_1 (SCM_I_MAKINUM (nreq))
#define REST_ARITY(nreq, rest) \
scm_list_2 (SCM_I_MAKINUM (nreq), rest)
-/* opts := #f | (aok? (pos? kw init) ...) */
-#define FULL_ARITY(nreq, rest, opts, alt) \
- scm_list_4 (SCM_I_MAKINUM (nreq), rest, opts, alt)
+#define FULL_ARITY(nreq, rest, nopt, kw, inits, alt) \
+ scm_list_n (SCM_I_MAKINUM (nreq), rest, SCM_I_MAKINUM (nopt), kw, inits, \
+ alt, SCM_UNDEFINED)
#define MAKMEMO_LAMBDA(body, arity) \
MAKMEMO (SCM_M_LAMBDA, (scm_cons (body, arity)))
#define MAKMEMO_LET(inits, body) \
@@ -1349,7 +1349,21 @@ unmemoize (const SCM expr)
unmemoize (CAR (args)));
}
else
- abort ();
+ {
+ SCM body = CAR (args), spec = CDR (args), alt;
+
+ alt = CADDR (CDDDR (spec));
+ if (scm_is_true (alt))
+ abort ();
+
+ return scm_list_3 (sym_lambda_star,
+ scm_list_5 (CAR (spec),
+ CADR (spec),
+ CADDR (spec),
+ CADDDR (spec),
+ unmemoize_exprs (CADR (CDDDR (spec)))),
+ unmemoize (body));
+ }
case SCM_M_LET:
return scm_list_3 (scm_sym_let,
unmemoize_bindings (CAR (args)),