Execute HQ9+/Ruby

From Rosetta Code
< Execute HQ9+(Redirected from RCHQ9+/Ruby)
Execute HQ9+/Ruby is an implementation of HQ9+. Other implementations of HQ9+.
Execute HQ9+/Ruby is part of RCHQ9+. You may find other members of RCHQ9+ at Category:RCHQ9+.

This Ruby program implements an HQ9+ interpreter.

class HQ9plus
Dispatch = Hash.new(:unknown).merge({
'h' => :hello,
'q' => :quine,
'9' => :beer,
'+' => :accumulate
})
 
def initialize(opts={})
@program = if opts[:program] then opts[:program]
elsif opts[:filename] then File.read(opts[:filename])
else ''
end
@accumulator = 0
end
attr_reader :accumulator
 
def run
@program.downcase.each_char {|char| self.send Dispatch[char]}
end
 
def hello
puts "Hello, world!"
end
 
def quine
puts @program
end
 
def beer
puts '99 bottles here ...'
end
 
def accumulate
@accumulator += 1
end
 
def unknown
# do nothing
end
end
 
hq9 = HQ9plus.new(:program => '+qhp;+9Q')
hq9.run
puts hq9.accumulator

Output:

+qhp;+9Q
Hello, world!
99 bottles here ...
+qhp;+9Q
2