Expression eval
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Function Syntax
float expression_eval(string expression )
- expression is a mathematical expression to be solved.
Evaluates an expression using only the base components of the evaluator:
- No spaces are allowed within the expression, except as part of a zone/location name.
- + - * / ( ) have their usual mathematical meaning and precedence.
- ^ is exponentiation, with the highest precedence.
- Functions available: ceil(x) floor(x) sqrt(x) min(x,y) max(x,y)
- Preferences function: pref(text)
- This must be used on preferences with a float value ONLY - merely retrieving an integer pref will corrupt it!
- There could be at most one of each text function in an expression.
- This is no longer the case however and multiple of the same text functions should now work properly.
- This wrapper allows user-defined variables to be used as well, which must have names starting with a lower-case letter (or underscore) to distinguish them from built-in variables. Variables are supplied as a float[string] map.
Code Sample
This script expands expression_eval() to include support for user-defined variables. It is extremely complex, but it is extremely useful to anyone who wants to use expression_eval().
float eval(string expr, float[string] vars) {
buffer b;
matcher m = create_matcher( "\\b[a-z_][a-zA-Z0-9_]*\\b", expr );
while (m.find()) {
string var = m.group(0);
if (vars contains var) {
m.append_replacement(b, vars[var].to_string());
}
// could implement functions, pref access, etc. here
}
m.append_tail(b);
return expression_eval(b.to_string());
}
# Everything below this line shows how to make use of eval().
# TESTING:
float[string] v;
v["pi"] = 3.14159265;
v["ten"] = 10;
print(eval("2+3", v));
print(eval("max(pi^ten,ten^pi)", v));
print(eval("sqrt(pi)*L", v));
print(eval("undefined/2", v));