1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

tweak to lambda* memoization format

* libguile/memoize.c (FULL_ARITY): Change the form to more closely
  approximate <lambda-case>.
  (unmemoize): Unmemoize lambda* expressions.
This commit is contained in:
Andy Wingo 2010-05-13 16:56:31 +02:00
parent 8f9c5b589d
commit 9658182d5f

View file

@ -183,9 +183,9 @@ scm_t_bits scm_tc16_memoized;
scm_list_1 (SCM_I_MAKINUM (nreq)) scm_list_1 (SCM_I_MAKINUM (nreq))
#define REST_ARITY(nreq, rest) \ #define REST_ARITY(nreq, rest) \
scm_list_2 (SCM_I_MAKINUM (nreq), rest) scm_list_2 (SCM_I_MAKINUM (nreq), rest)
/* opts := #f | (aok? (pos? kw init) ...) */ #define FULL_ARITY(nreq, rest, nopt, kw, inits, alt) \
#define FULL_ARITY(nreq, rest, opts, alt) \ scm_list_n (SCM_I_MAKINUM (nreq), rest, SCM_I_MAKINUM (nopt), kw, inits, \
scm_list_4 (SCM_I_MAKINUM (nreq), rest, opts, alt) alt, SCM_UNDEFINED)
#define MAKMEMO_LAMBDA(body, arity) \ #define MAKMEMO_LAMBDA(body, arity) \
MAKMEMO (SCM_M_LAMBDA, (scm_cons (body, arity))) MAKMEMO (SCM_M_LAMBDA, (scm_cons (body, arity)))
#define MAKMEMO_LET(inits, body) \ #define MAKMEMO_LET(inits, body) \
@ -1349,7 +1349,21 @@ unmemoize (const SCM expr)
unmemoize (CAR (args))); unmemoize (CAR (args)));
} }
else 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: case SCM_M_LET:
return scm_list_3 (scm_sym_let, return scm_list_3 (scm_sym_let,
unmemoize_bindings (CAR (args)), unmemoize_bindings (CAR (args)),