ref: c30d393c163211378fc9d908aab41a6dde0330af
parent: 6bfb55fb32fa2713c5527968733e26540f999af0
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Nov 12 14:27:30 EST 2024
map: sync with Julia's implementation
--- a/flisp.c
+++ b/flisp.c
@@ -2076,35 +2076,37 @@
lerrorf(FL(ArgError), "too few arguments");
if(!iscons(args[1]))
return FL(Nil);
- value_t first, last, v;
- intptr_t argSP = args-FL(stack);
+ value_t v;
+ intptr_t first, last, argSP = args-FL(stack);
assert(argSP >= 0 && argSP < FL(nstack));
if(nargs == 2){
- if(FL(sp)+3 > FL(nstack))
+ if(FL(sp)+4 > FL(nstack))
grow_stack();
PUSH(FL(stack)[argSP]);
PUSH(car_(FL(stack)[argSP+1]));
v = _applyn(1);
+ POPN(2);
PUSH(v);
v = mk_cons();
car_(v) = POP(); cdr_(v) = FL(Nil);
- last = first = v;
+ PUSH(v);
+ PUSH(v);
+ first = FL(sp)-2;
+ last = FL(sp)-1;
FL(stack)[argSP+1] = cdr_(FL(stack)[argSP+1]);
- fl_gc_handle(&first);
- fl_gc_handle(&last);
while(iscons(FL(stack)[argSP+1])){
- FL(stack)[FL(sp)-2] = FL(stack)[argSP];
- FL(stack)[FL(sp)-1] = car_(FL(stack)[argSP+1]);
+ PUSH(FL(stack)[argSP]);
+ PUSH(car_(FL(stack)[argSP+1]));
v = _applyn(1);
+ POPN(2);
PUSH(v);
v = mk_cons();
car_(v) = POP(); cdr_(v) = FL(Nil);
- cdr_(last) = v;
- last = v;
+ cdr_(FL(stack)[last]) = v;
+ FL(stack)[last] = v;
FL(stack)[argSP+1] = cdr_(FL(stack)[argSP+1]);
}
POPN(2);
- fl_free_gc_handles(2);
}else{
int i;
while(FL(sp)+nargs+1 > FL(nstack))
@@ -2119,9 +2121,10 @@
PUSH(v);
v = mk_cons();
car_(v) = POP(); cdr_(v) = FL(Nil);
- last = first = v;
- fl_gc_handle(&first);
- fl_gc_handle(&last);
+ PUSH(v);
+ PUSH(v);
+ first = FL(sp)-2;
+ last = FL(sp)-1;
while(iscons(FL(stack)[argSP+1])){
PUSH(FL(stack)[argSP]);
for(i = 1; i < nargs; i++){
@@ -2133,12 +2136,12 @@
PUSH(v);
v = mk_cons();
car_(v) = POP(); cdr_(v) = FL(Nil);
- cdr_(last) = v;
- last = v;
+ cdr_(FL(stack)[last]) = v;
+ FL(stack)[last] = v;
}
- fl_free_gc_handles(2);
+ POPN(2);
}
- return first;
+ return FL(stack)[first];
}
BUILTIN("for-each", for_each)