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

From Rosetta Code
Content added Content deleted
(add Ruby)
 
m (needs attention: nested loops)
Line 1: Line 1:
{{implementation|Brainf***}}{{collection|RCBF}}[[Category:Ruby]]
{{implementation|Brainf***}}{{collection|RCBF}}[[Category:Ruby]]
{{needs-review|Ruby|'''Does not handle nested loops.'''}}
More effort could be made to read a program from a file or from stdin.
More effort could be made to read a program from a file or from stdin.

<lang ruby>class RCBF
<lang ruby>class RCBF
def initialize(program)
def initialize(program)

Revision as of 20:19, 30 July 2009

Execute Brain****/Ruby is an implementation of Brainf***. Other implementations of Brainf***.
Execute Brain****/Ruby is part of RCBF. You may find other members of RCBF at Category:RCBF.
This example may be incorrect.
Does not handle nested loops.
Please verify it and remove this message. If the example does not match the requirements or does not work, replace this message with Template:incorrect or fix the code yourself.

More effort could be made to read a program from a file or from stdin.

<lang ruby>class RCBF

 def initialize(program)
   @d = [0] * 30_000
   @program = program
 end
 def run
   dc = 0
   pc = 0
   while pc < @program.length
     print [pc, @program[pc].chr].inspect if $DEBUG
     case @program[pc]
     when ?> 
       dc += 1
       print "\t#{dc}" if $DEBUG
     when ?< 
       dc -= 1
       print "\t#{dc}" if $DEBUG
     when ?+ 
       @d[dc] += 1
       print "\t#{dc},#{@d[dc]}" if $DEBUG
     when ?- 
       @d[dc] -= 1
       print "\t#{dc},#{@d[dc]}" if $DEBUG
     when ?. 
       print "\t#{dc},#{@d[dc]}\t" if $DEBUG
       print @d[dc].chr
     when ?, then
       @d[dc] = $stdin.getc
       print "\t#{dc},#{@d[dc]}" if $DEBUG
     when ?[ then
       if @d[dc] == 0
         pc += 1 while @program[pc] != ?]
         p "  #{[pc,@program[pc].chr].inspect}" if $DEBUG
       end
     when ?] then
       if @d[dc] != 0
         pc -= 1 while @program[pc] != ?[
         p "  #{[pc,@program[pc].chr].inspect}" if $DEBUG
       end
     end
     puts if $DEBUG
     pc += 1
   end
 end

end</lang> Test:

irb(main):048:0> helloworld = '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.'
=> "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."
irb(main):049:0> bf = RCBF.new(helloworld)
=> #<RCBF:0x7ff537d0 @d=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
...
irb(main):050:0> bf.run
Hello World!
=> nil