示例#1
0
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))
}
示例#2
0
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
}
示例#3
0
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"
}
示例#4
0
//!+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
}