HQ9+ interpreter
commit
d1893f865c
@ -0,0 +1,64 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
# HQ9++ is an object-oriented extension of the well-known esoteric language
|
||||||
|
# HQ9+, created by Cliff L. Biffle.
|
||||||
|
#
|
||||||
|
# From: http://www.dangermouse.net/esoteric/hq9plusplus.html
|
||||||
|
#
|
||||||
|
# Commands
|
||||||
|
#
|
||||||
|
# * H
|
||||||
|
# Prints "Hello, world!".
|
||||||
|
# * Q
|
||||||
|
# Prints the entire text of the source code file.
|
||||||
|
# * 9
|
||||||
|
# Prints the complete canonical lyrics to "99 Bottles of Beer on the Wall".
|
||||||
|
# * +
|
||||||
|
# Increments the accumulator.
|
||||||
|
# * ++
|
||||||
|
# When the sequence ++ is encountered, it (naturally) increments the
|
||||||
|
# accumulator twice, and also instantiates an object of a new subclass of the
|
||||||
|
# generic superclass. In line with the best data-hiding principles, there is
|
||||||
|
# no way to access this object.
|
||||||
|
|
||||||
|
plusplus = true
|
||||||
|
source = gets
|
||||||
|
|
||||||
|
def beer(n)
|
||||||
|
if n == 1
|
||||||
|
puts "1 bottle of beer on the wall"
|
||||||
|
puts "1 bottle of beer"
|
||||||
|
puts "Take one down and pass it around"
|
||||||
|
puts "No bottles of beer on the wall"
|
||||||
|
else
|
||||||
|
puts "#{n} bottles of beer on the wall"
|
||||||
|
puts "#{n} bottles of beer"
|
||||||
|
puts "Take one down and pass it around"
|
||||||
|
puts "#{n-1} bottles of beer on the wall"
|
||||||
|
puts
|
||||||
|
beer(n-1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
accumulator = 0
|
||||||
|
last_instruction = nil
|
||||||
|
objects = []
|
||||||
|
|
||||||
|
source.split(//).each do |instruction|
|
||||||
|
case instruction
|
||||||
|
when "H"
|
||||||
|
puts "Hello world!"
|
||||||
|
when "Q"
|
||||||
|
puts source
|
||||||
|
when "9"
|
||||||
|
beer(99)
|
||||||
|
when "+"
|
||||||
|
accumulator += 1
|
||||||
|
if plusplus && last_instruction == "+"
|
||||||
|
objects << Class.new.new
|
||||||
|
end
|
||||||
|
when "\n", " "
|
||||||
|
else
|
||||||
|
die "Syntax error"
|
||||||
|
end
|
||||||
|
last_instruction = instruction
|
||||||
|
end
|
Loading…
Reference in New Issue