diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/interp.c | 16 | ||||
| -rw-r--r-- | src/interp.h | 1 | ||||
| -rw-r--r-- | src/primitives.c | 2 |
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) { |
