Execute Brain****: Difference between revisions

Pre-calc jmps
(Added zkl)
(Pre-calc jmps)
Line 1,688:
 
=={{header|zkl}}==
<lang zkl>constfcn CELLSbf(pgm,input=0d30_000;""){
const CELLS=0d30_000;
fcn bf(pgm,input=""){
if(Void==pgm.span("[","]")){ println("Mismatched brackets"); return(); }
fcn(code,z,jmpFwd,jmpBack){ // build jump tables (for [ & ])
if(span:=code.span("[","]")){
a,b:=span; b+=a-1; jmpFwd[a+z]=b+z; jmpBack[b+z]=a+z;
self.fcn(code[a+1,b-a-1],z+a+1,jmpFwd,jmpBack);
self.fcn(code[b+1,*],z+b+1,jmpFwd,jmpBack);
}
}(pgm,0,jmpFwd:=D(),jmpBack:=D());
 
tape:=CELLS.pump(Data(CELLS,Int),0);
ip:=dp:=0; input=input.walker();
Line 1,702 ⟶ 1,710:
case("."){ tape[dp].toChar().print() }
case(","){ c:=input._next(); tape[dp]=(c and input.value or 0); }
case("["){ if(0==tape[dp]){ ip+=pgmjmpFwd[ip,*].span("[","]")[1]-1; }}
case("]"){ if(tape[dp]) { ip=jmpBack[ip] }}
if(tape[dp]){
b:=1; while(b){ c:=pgm[ip-=1]; b=b + (c=="]") - (c=="[") }
}
}
}
ip+=1;
Anonymous user