func Eval(tree ast.Node) (*big.Rat, error) { switch node := tree.(type) { case *ast.Number: return parseNumNode(node) case *ast.BaseNode: return evalNodes(tree.Children()) default: return nil, fmt.Errorf("Unkown node type: %T", tree) } }