aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent665fb6be7eef3703c8e543645d09f329b9a466c5 (diff)
use nreverse
Diffstat (limited to 'src')
-rw-r--r--src/interp.c16
-rw-r--r--src/interp.h1
-rw-r--r--src/primitives.c2
3 files changed, 17 insertions, 2 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;
diff --git a/src/interp.h b/src/interp.h
index 36fd1e0..d4940e0 100644
--- a/src/interp.h
+++ b/src/interp.h
@@ -77,6 +77,7 @@ SExpRef Interp_load_file(Interp *interp, const char *filename);
const char* lisp_to_string(Interp *interp, SExpRef val);
SExpRef lisp_macroexpand1(Interp *interp, SExpRef macro, SExpRef args);
+SExpRef lisp_nreverse(Interp *interp, SExpRef lst);
SExpRef lisp_reverse(Interp *interp, SExpRef lst);
void lisp_defun(Interp *interp, SExpRef name, SExpRef val);
void lisp_defvar(Interp *interp, SExpRef name, SExpRef val);
diff --git a/src/primitives.c b/src/primitives.c
index 1c0d1e3..b66f357 100644
--- a/src/primitives.c
+++ b/src/primitives.c
@@ -453,7 +453,7 @@ static SExpRef quasi_on_list(Interp *interp, SExpRef lst) {
iter = CDR(iter);
}
- return lisp_reverse(interp, newlst);
+ return lisp_nreverse(interp, newlst);
}
SExpRef primitive_quasi(Interp *interp, SExpRef args, bool istail) {