def evaluate(parse_tree_node, &block)
    if block
      yield parse_tree_node, self
    elsif parse_tree_node.respond_to? :evaluate
      puts_result parse_tree_node.evaluate
    else
      pretty_print_parse_tree parse_tree_node
    end
  rescue Exception => e
    errputs "Error evaluating parse tree: #{e}\n" + ["Backtrace:",e.backtrace].flatten.join("\n  ")
    pretty_print_parse_tree parse_tree_node
  end
def evaluate(parse_tree_node, &block)
    if block
      yield parse_tree_node, self
    elsif parse_tree_node.respond_to? :evaluate
      puts_result parse_tree_node.evaluate
    else
      pretty_print_parse_tree parse_tree_node
    end
  rescue Exception => e
    errputs "Error evaluating parse tree: #{e}\n" + ["Backtrace:",e.backtrace].flatten.join("\n  ")
    pretty_print_parse_tree parse_tree_node
  end
Providing a block overrides all evaluate behavor and simply:  yield parse_tree_node, self
 elsif parse_tree_node responds to "evaluate":                 puts_result parse_tree_node.evaluate
 else                                                          pretty-print the parse-tree
 rescue and pretty-print errors