Jump to content

Execute Brain****/Icon: Difference between revisions

Updated entry to account for nested brackets, reformatted to shorten source line lengths, touched on the ruler, added hello option to test nested brackets
(c&p error)
(Updated entry to account for nested brackets, reformatted to shorten source line lengths, touched on the ruler, added hello option to test nested brackets)
Line 1:
{{incorrect|Icon|Nested brackets are not interpreted correctly.<pre>
>++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>
>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++.
</pre>}}
 
This version of BF takes program and input from the parameter list.
Memory grows as needed from a single cell.
Line 9 ⟶ 4:
<pre>BF programtext inputtext</pre>
 
<lang Icon>#
# bf interpreter
#
procedure main(arglist)
 
prog := get(arglist)
 
# test for nested brackets, previous version was deemed incorrect
if \prog == "hello" then
prog := ">++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>" ||
"]<<]>.+++++++..+++.>>+++++++.<<<[[-]<[-]>]<+++++++++" ||
>+++++++.<<<[[-]<[-]>]<+++++++++ "++++++.>>.+++.------.--------.>>+.>++++."
 
# default program
/prog := "++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++" ||
"++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>>" ||
">+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++." ||
"<+++++++.--------.<<<<<+.<+++.---."
 
input := get(arglist)
/input := ""
Line 34 ⟶ 40:
write("Program is well formed.")
write("Program=",image(prog))
write("Ruler =",image(repl("0123456789",*prog/10)))
*image(prog)/10 + 1)[1:*image(prog)-1]))
 
# 2. execute
Line 40 ⟶ 47:
cell := 1
mem := [0]
nest := 0
 
prog ? while i := move(1) do {
 
case i of {
 
">" : # increment the pointer (to point to the next cell to the right)
">" :
if ( cell +:= 1 ) > *mem then
put(mem, 0)
 
"<" : # decrement the pointer (to point to the next cell to the left)
"<" :
if ( cell -:= 1 ) < 1 then
runerr(205,cell)
 
"+" : mem[cell] +:= 1 # increment (increase by one) the byte at the pointer.
"+" : mem[cell] +:= 1
 
"-" : mem[cell] -:= 1 # decrement (decrease by one) the byte at the pointer.
"-" : mem[cell] -:= 1
 
"." : writes(char(mem[cell])) # output the value of the byte at the pointer.
"." : writes(char(mem[cell]))
 
"," : input ?:= ( mem[cell] := move(1), tab(0) ) # accept one byte of input, storing its value in the byte at the pointer.
"," : input ?:= ( mem[cell] := move(1), tab(0) )
 
"[" : if mem[cell] = 0 then { # jump forward to the command after the corresponding ] if the byte at the pointer is zero.
# if the byte at the pointer is zero.
"[" : if mem[cell] = 0 then {
repeat {
i := move(1)
if i == "][" then breaknest +:= 1 & next
}if i == "]" then if nest = 0 then break else nest -:= 1
}
}
 
"]" : if mem[cell] ~= 0 then { # jump back to the command after the corresponding [ if the byte at the pointer is nonzero.
# if the byte at the pointer is nonzero.
"]" : if mem[cell] ~= 0 then {
move(-1)
repeat {
i := move(-1)
if i == "[]" then breaknest +:= 1 & next
if i == "[" then if nest = 0 then break else nest -:= 1
}
move(1)
}
}
} # everything else is ignored/comment
}
end</lang>
Line 82 ⟶ 105:
Program is well formed.
Program="++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>>>+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++.<+++++++.--------.<<<<<+.<+++.---."
Ruler ="0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345"
Ruler ="0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
Goodbye, World!
 
#BF hello
Program is well formed.
Program=">++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++."
Ruler ="012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123"
Hello World!
</pre>
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.