func calc(w http.ResponseWriter, req *http.Request) { input := req.URL.Query().Get("formula") fmt.Println(input) if len(input) < 1 { w.WriteHeader(http.StatusNotFound) fmt.Fprintf(w, "formula is not found.") } //fmt.Println(input) e, err := eval.Parse(input) if err != nil { log.Fatal(fmt.Errorf("parse error\n%s", err)) } // vars := eval.ExtractVars(e) vars := make(map[eval.Var]bool) if err := e.Check(vars); err != nil { log.Fatal(err) } env := make(eval.Env) if len(vars) > 0 { for v := range vars { s := req.URL.Query().Get(string(v)) env[v], err = strconv.ParseFloat(s, 64) if err != nil { log.Fatal(fmt.Errorf("this value is invalid.\n%s", err)) } } } fmt.Fprintf(w, "Answer: %f", e.Eval(env)) }
func calculate(s string) (string, error) { if s == "" { return "", nil } expr, err := eval.Parse(s) if err != nil { return "", err } ans := fmt.Sprintf("%.6g", expr.Eval(env)) return ans, nil }
func Example_expr() { e, _ := eval.Parse("sqrt(A / pi)") Display("e", e) // Output: // Display e (eval.call): // e.fn = "sqrt" // e.args[0].type = eval.binary // e.args[0].value.op = 47 // e.args[0].value.x.type = eval.Var // e.args[0].value.x.value = "A" // e.args[0].value.y.type = eval.Var // e.args[0].value.y.value = "pi" }
//!+parseAndCheck func parseAndCheck(s string) (eval.Expr, error) { if s == "" { return nil, fmt.Errorf("empty expression") } expr, err := eval.Parse(s) if err != nil { return nil, err } vars := make(map[eval.Var]bool) if err := expr.Check(vars); err != nil { return nil, err } for v := range vars { if v != "x" && v != "y" && v != "r" { return nil, fmt.Errorf("undefined variable: %s", v) } } return expr, nil }