aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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) {