loop { var expr = Sys.readln("\nBoolean expression (e.g. 'a & b'): ").strip.lc break if expr.is_empty; var vars = expr.scan(/[[:alpha:]]+/) if (vars.is_empty) { say "no variables detected in your boolean expression" next } var prefix = []; var suffix = []; vars.each { |v| print "#{v}\t" prefix << "[false, true].each { |#{v}|" suffix << "}" } say "| #{expr}" var body = ("say (" + vars.map{|v| v+",'\t'," }.join + " '| ', #{expr})") eval(prefix + [body] + suffix -> join("\n")) }