Execute Brain****: Difference between revisions

No edit summary
Line 646:
*********************************/
 
Tape : #(0)
DataPointer : 0
InstructionPointer : 0
 
// Look for jumps in codeCode an register them
// in the Jumps table
 
precomputeJumps: {
stack : #()
jumphash : #{}
instrPointer : 0
 
loop instrPointer<CodeLength {
command: $(get $(characters[chars Code) ].[instrPointer)]
if command="[" { stack: stack+instrPointer } {
if command="]" {
target: $(last stack)
deleteBy stack $([size stack)]-1
set jumphash $(.[toString target)]: instrPointer
set jumphash $(.[toString instrPointer)]: target
}
}
instrPointer: instrPointer+1
}
jumphash
Line 675:
// Check if current state is valid
 
StateIsValid: {
all #(0<=DataPointer DataPointer<$([size Tape)] 0<=InstructionPointer InstructionPointer<CodeLength)
}
 
// Compile the program
 
interpret: {
loop $([StateIsValid) ~] {
command: $(get $(characters[chars Code) ].[InstructionPointer)]
if command="+" set{ Tape.[DataPointer]: Tape.[DataPointer]+1 inp}
 
|if command="+-" { set Tape .[DataPointer]: Tape.[DataPointer]+-1 }
|if command="->" { setDataPointer: TapeDataPointer+1, if DataPointer=[size Tape.[DataPointer]-1 { Tape: Tape+0 } }
|if command="><" { DataPointer: DataPointer+-1, if DataPointer=$(size Tape) { Tape Tape+0 } }
|if command="<." { DataPointerprints [char Tape.[DataPointer-1]] }
|if command=".," { print $(char Tape.[DataPointer]) true }
| command="," { inp: toNumber|input ~
if inp=13 { inp: $(toNumber10 input)}
|if inp=133 { inppanic "something went 10wrong!" }
|Tape.DataPointer: inp=3 { panic "something went wrong!" }
set Tape DataPointer inp
}
|if command="[" {
if Tape.[DataPointer]=0 { InstructionPointer: Jumps.[$(toString InstructionPointer)] }
}
|if command="]" {
if Tape.[DataPointer]!=0 { InstructionPointer: Jumps.[$(toString InstructionPointer)] }
}
 
InstructionPointer: InstructionPointer+1
}
}
 
if $([size &)]<1 { panic "Not enough arguments - Usage: bfc <script>" }
 
Code : $(read &0)
CodeLength : $(size Code)
Jumps : precomputeJumps $(precomputeJumps)~
 
interpret ~
</lang>
 
1,532

edits