diff options
| author | Mistivia <i@mistivia.com> | 2025-06-23 00:04:01 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-06-23 00:04:01 +0800 |
| commit | 89f144d3ab27e54f7ad8cbf393418a3baa169f0f (patch) | |
| tree | 45ec23a86cdc86300f4f83321c79eb38b80bdffc /src/primitives.c | |
| parent | 7563e4e5c3c346b8b11f7e66cdb11c81bcf58fa9 (diff) | |
add test case
Diffstat (limited to 'src/primitives.c')
| -rw-r--r-- | src/primitives.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/primitives.c b/src/primitives.c index b66f357..899cbdd 100644 --- a/src/primitives.c +++ b/src/primitives.c @@ -359,9 +359,13 @@ static SExpRef build_function_env(Interp *interp, SExpRef func, SExpRef args) { SExpRef primitive_funcall(Interp *interp, SExpRef args, bool istail) { if (LENGTH(args) < 1) goto error; - args = lisp_eval_args(interp, args); - if (CTL_FL(args)) return args; - SExpRef ret = lisp_apply(interp, CAR(args), CDR(args), istail); + SExpRef evaled = lisp_eval_args(interp, args); + if (CTL_FL(evaled)) return evaled; + SExpRef fn = CAR(evaled); + SExpRef fnargs = CDR(evaled); + PUSH_REG(fn); + SExpRef ret = lisp_apply(interp, fn, fnargs, istail); + POP_REG(); return ret; error: return new_error(interp, "funcall: syntax error.\n"); @@ -392,7 +396,10 @@ SExpRef primitive_apply(Interp *interp, SExpRef args, bool istail) { args = lisp_eval_args(interp, args); if (CTL_FL(args)) return args; if (!lisp_check_list(interp, CADR(args))) goto error; - ret = lisp_apply(interp, CAR(args), CADR(args), istail); + SExpRef fn = CAR(args); + PUSH_REG(fn); + ret = lisp_apply(interp, fn, CADR(args), istail); + POP_REG(); return ret; error: return new_error(interp, "apply: syntax error.\n"); |
