class Array def random self[rand(length)] end end class String def margin gsub /^\s*[|]/,'' end end def statements(n) (1..n).collect { statement } end def function def formals n = rand(5) return '' if n == 0 "("+(1..n).collect {identifier}.join(',')+")" end %Q{ |def #{identifier}#{formals} | #{statements(rand(100)).join("\n ")} | end }.margin end def identifier (-6..rand(5)).collect { ("a"[0]+rand(26)).chr }.join end def statement "#{l_val} #{assignment} #{expression}" end def l_val case rand(5) when 1 then l_val + '.' + identifier when 3 then identifier+'['+expression+']' else identifier end end def assignment %w{ = *= **= }.random end def value case rand(5) when 1 then l_val + '.' + identifier when 2 then rand(10000).to_s when 3 then identifier+'['+expression+']' else identifier end end def expression case rand(4) when 1 then "#{expression} #{%w{ + - * / && || ** }.random} #{expression}" when 2 then "(#{expression})" else value end end 1000.times { print function }