diff options
author | Mark H Weaver <mhw@netris.org> | 2013-03-28 05:09:53 -0400 |
---|---|---|
committer | Mark H Weaver <mhw@netris.org> | 2013-03-28 05:09:53 -0400 |
commit | 26d148066f9cb20e395a7dc4fefdf2e2ef0b2fb0 (patch) | |
tree | 40f13bc6355adb822bb8cd01fee5bcd9fd5430f9 /libguile/memoize.c | |
parent | 8ae26afefee947c71314733c419519fb616bf36d (diff) | |
parent | 579127cce488ce208d62e68e679e34fbbdc17367 (diff) | |
download | guile-26d148066f9cb20e395a7dc4fefdf2e2ef0b2fb0.tar.gz |
Merge remote-tracking branch 'origin/stable-2.0'
Conflicts:
configure.ac
libguile/deprecated.c
libguile/deprecated.h
libguile/filesys.h
libguile/fluids.c
libguile/fports.c
libguile/gc.c
libguile/guile.c
libguile/numbers.c
libguile/objcodes.c
libguile/r6rs-ports.c
libguile/smob.c
libguile/socket.c
libguile/threads.h
module/language/scheme/decompile-tree-il.scm
module/language/tree-il/peval.scm
test-suite/tests/syncase.test
Diffstat (limited to 'libguile/memoize.c')
-rw-r--r-- | libguile/memoize.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/libguile/memoize.c b/libguile/memoize.c index 7431d3c0e..f20241c20 100644 --- a/libguile/memoize.c +++ b/libguile/memoize.c @@ -284,14 +284,33 @@ memoize (SCM exp, SCM env) memoize (REF (exp, SEQ, TAIL), env)); case SCM_EXPANDED_LAMBDA: - /* The body will be a lambda-case. */ + /* The body will be a lambda-case or #f. */ { - SCM meta, docstring, proc; + SCM meta, docstring, body, proc; meta = REF (exp, LAMBDA, META); docstring = scm_assoc_ref (meta, scm_sym_documentation); - proc = memoize (REF (exp, LAMBDA, BODY), env); + body = REF (exp, LAMBDA, BODY); + if (scm_is_false (body)) + /* Give a body to case-lambda with no clauses. */ + proc = MAKMEMO_LAMBDA + (MAKMEMO_CALL + (MAKMEMO_MOD_REF (list_of_guile, + scm_from_latin1_symbol ("throw"), + SCM_BOOL_F), + 5, + scm_list_5 (MAKMEMO_QUOTE (scm_args_number_key), + MAKMEMO_QUOTE (SCM_BOOL_F), + MAKMEMO_QUOTE (scm_from_latin1_string + ("Wrong number of arguments")), + MAKMEMO_QUOTE (SCM_EOL), + MAKMEMO_QUOTE (SCM_BOOL_F))), + FIXED_ARITY (0), + SCM_BOOL_F /* docstring */); + else + proc = memoize (body, env); + if (scm_is_string (docstring)) { SCM args = SCM_MEMOIZED_ARGS (proc); |