aboutsummaryrefslogtreecommitdiff
path: root/src/interp.c
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-06-22 18:10:32 +0800
committerMistivia <i@mistivia.com>2025-06-22 18:10:32 +0800
commitdacb6b16b205661189c51cb7ce25efab96e8682b (patch)
tree0acd0c2fc6dfc4a1b690bc8a50bc36bce1b62bdd /src/interp.c
parent665fb6be7eef3703c8e543645d09f329b9a466c5 (diff)
use nreverse
Diffstat (limited to 'src/interp.c')
-rw-r--r--src/interp.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/interp.c b/src/interp.c
index a8c9ad7..befd28d 100644
--- a/src/interp.c
+++ b/src/interp.c
@@ -566,6 +566,20 @@ SExpRef lisp_reverse(Interp *interp, SExpRef lst) {
return ret;
}
+SExpRef lisp_nreverse(Interp *interp, SExpRef lst) {
+ SExpRef prev = NIL;
+ SExpRef cur = lst;
+ SExpRef next_node;
+
+ while (!NILP(cur)) {
+ next_node = CDR(cur);
+ REF(cur)->pair.cdr = prev;
+ prev = cur;
+ cur = next_node;
+ }
+ return prev;
+}
+
SExpRef lisp_eval_args(Interp *interp, SExpRef args) {
SExpRef ret = interp->nil;
SExpRef cur = args;
@@ -583,7 +597,7 @@ SExpRef lisp_eval_args(Interp *interp, SExpRef args) {
ret = CONS(evalres, ret);
cur = CDR(cur);
}
- ret = lisp_reverse(interp, ret);
+ ret = lisp_nreverse(interp, ret);
end:
Interp_gc(interp, ret);
return ret;