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

From Rosetta Code
Content added Content deleted
(new BF)
 
m (Fixed syntax highlighting.)
 
(5 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{implementation|Brainf***}}{{collection|RCBF}}
This version of BF takes program and input from the parameter list.
This version of BF takes program and input from the parameter list.
Memory grows as needed from a single cell.
If no program is specified, the hello world program is run.
<pre>BF programtext inputtext</pre>
<pre>BF programtext inputtext</pre>


<syntaxhighlight lang="icon">#
<lang Icon>
# bf interpreter
#
procedure main(arglist)
procedure main(arglist)


prog := get(arglist)
prog := get(arglist)

# test for nested brackets, previous version was deemed incorrect
if \prog == "hello" then
prog := ">++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>" ||
"]<<]>.+++++++..+++.>>+++++++.<<<[[-]<[-]>]<+++++++++" ||
"++++++.>>.+++.------.--------.>>+.>++++."

# default program
/prog := "++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++" ||
/prog := "++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++" ||
"++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>>" ||
"++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>>" ||
">+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++." ||
">+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++." ||
"<+++++++.--------.<<<<<+.<+++.---."
"<+++++++.--------.<<<<<+.<+++.---."

input := get(arglist)
input := get(arglist)
/input := ""
/input := ""



# 1. toss obvious errors
# 1. toss obvious errors
Line 28: Line 41:
write("Program is well formed.")
write("Program is well formed.")
write("Program=",image(prog))
write("Program=",image(prog))
write("Ruler =",image(repl("0123456789",*prog/10)))
write("Ruler =",image(repl("0123456789",
*image(prog)/10 + 1)[1:*image(prog)-1]))


# 2. execute
# 2. execute
Line 34: Line 48:
cell := 1
cell := 1
mem := [0]
mem := [0]
nest := 0


prog ? while i := move(1) do {
prog ? while i := move(1) do {

case i of {
case i of {


">" : # increment the pointer (to point to the next cell to the right)
# increment the pointer (to point to the next cell to the right)
">" :
if ( cell +:= 1 ) > *mem then
if ( cell +:= 1 ) > *mem then
put(mem, 0)
put(mem, 0)

"<" : # decrement the pointer (to point to the next cell to the left)
# decrement the pointer (to point to the next cell to the left)
"<" :
if ( cell -:= 1 ) < 1 then
if ( cell -:= 1 ) < 1 then
runerr(205,cell)
runerr(205,cell)


"+" : mem[cell] +:= 1 # increment (increase by one) the byte at the pointer.
# increment (increase by one) the byte at the pointer.
"+" : mem[cell] +:= 1


"-" : mem[cell] -:= 1 # decrement (decrease by one) the byte at the pointer.
# 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.
# 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.
# 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.
# jump forward to the command after the corresponding ]
# if the byte at the pointer is zero.
"[" : if mem[cell] = 0 then {
repeat {
repeat {
i := move(1)
i := move(1)
if i == "]" then break
if i == "[" then nest +:= 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.
# jump back to the command after the corresponding [
# if the byte at the pointer is nonzero.
"]" : if mem[cell] ~= 0 then {
move(-1)
repeat {
repeat {
i := move(-1)
i := move(-1)
if i == "[" then break
if i == "]" then nest +:= 1 & next
if i == "[" then if nest = 0 then break else nest -:= 1
}
}
move(1)
}
}
}
} # everything else is ignored/comment
# everything else is ignored/comment
}
}
end</lang>
end</syntaxhighlight>


Sample output:
Sample output:
Line 76: Line 106:
Program is well formed.
Program is well formed.
Program="++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>>>+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++.<+++++++.--------.<<<<<+.<+++.---."
Program="++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>>>+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++.<+++++++.--------.<<<<<+.<+++.---."
Ruler ="0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345"
Ruler ="0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
Goodbye, World!
Goodbye, World!

#BF hello
Program is well formed.
Program=">++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++."
Ruler ="012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123"
Hello World!
</pre>
</pre>

Latest revision as of 11:25, 1 September 2022

Execute Brain****/Icon is an implementation of Brainf***. Other implementations of Brainf***.
Execute Brain****/Icon is part of RCBF. You may find other members of RCBF at Category:RCBF.

This version of BF takes program and input from the parameter list. Memory grows as needed from a single cell. If no program is specified, the hello world program is run.

BF programtext inputtext
#
# 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 := ""

# 1. toss obvious errors

b := 0
prog ? while i := move(1) do {
   case i of {
      "[" : b +:= 1
      "]" : b -:= 1
      }
   if b < 0 then stop("malformed program, unbalanced []")
   }
if b > 0 then stop("malformed program, unbalanced []")

write("Program is well formed.")
write("Program=",image(prog))
write("Ruler  =",image(repl("0123456789",
      *image(prog)/10 + 1)[1:*image(prog)-1]))

# 2. execute

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)

      # increment (increase by one) the byte at the pointer.
      "+" : mem[cell] +:= 1

      # decrement (decrease by one) the byte at the pointer.
      "-" : mem[cell] -:= 1

      # output the value of the byte at the pointer.
      "." : writes(char(mem[cell]))

      # accept one byte of input, storing its value in the byte at the pointer.
      "," : input ?:= ( mem[cell] := move(1), tab(0) )

      # jump forward to the command after the corresponding ]
      # if the byte at the pointer is zero.
      "[" : if mem[cell] = 0 then {
            repeat {
               i := move(1)
               if i == "[" then nest +:= 1 & next
               if i == "]" then if nest = 0 then break else nest -:= 1
               }
            }

      # jump back to the command after the corresponding [
      # if the byte at the pointer is nonzero.
      "]" : if mem[cell] ~= 0 then {
            move(-1)
            repeat {
               i := move(-1)
               if i == "]" then nest +:= 1 & next
               if i == "[" then if nest = 0 then break else nest -:= 1
               }
            move(1)
            }
      }
      # everything else is ignored/comment
   }
end

Sample output:

#BF 
Program is well formed.
Program="++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>>>+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++.<+++++++.--------.<<<<<+.<+++.---."
Ruler  ="0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345"
Goodbye, World!

#BF hello
Program is well formed.
Program=">++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++."
Ruler  ="012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123"
Hello World!