diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-02-05 17:10:11 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-02-05 17:10:11 -0800 |
commit | 04a75123fc2f6135850a811bf7477ed97fdcdc83 (patch) | |
tree | e98d53b542ff02cb9d1f3673606d41acdf304858 /eval.c | |
parent | 227f0d19dc5313edbebbb56ba6b4966012a2370e (diff) | |
download | txr-04a75123fc2f6135850a811bf7477ed97fdcdc83.tar.gz txr-04a75123fc2f6135850a811bf7477ed97fdcdc83.tar.bz2 txr-04a75123fc2f6135850a811bf7477ed97fdcdc83.zip |
Allow sequences and hashes to be called as functions.
This is already supported in the DWIM operator.
* eval.c (apply): If object isn't a function, gather the
arguments into an array and delegate to generic_funcall.
* lib.c (generic_funcall): Changed from static to external linkage.
Supports sequences and hashes as functions. Error messages
fixed not to refer to "funcall".
(funcall, funcall1, funcall2, funcall3, funcall4): Do not throw
exception if fun is not of FUN type; instead, delegate
to generic_funcall. Error messages fixed not to refer to "funcall".
* lib.h (generic_function): Declared.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 10 |
1 files changed, 10 insertions, 0 deletions
@@ -340,6 +340,16 @@ val apply(val fun, val arglist, val ctx_form) fun = cdr(binding); } + if (!functionp(fun)) { + for (nargs = 0; + (p < arg + 32) && consp(arglist); + nargs++, p++, arglist = cdr(arglist)) + { + *p = car(arglist); + } + return generic_funcall(fun, arg, nargs); + } + type_check (fun, FUN); if (!listp(arglist)) { |