#!/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