Nift - exprtk
Nift has the C++ Mathematical Expression Toolkit Library (ExprTk) embedded (official website, GitHub). ExprTk is a simple to use, easy to integrate and extremely efficient run-time mathematical expression parser and evaluation engine. ExprTk supports numerous forms of functional, logical and vector processing semantics and is very easily extendible.
Contents
ExprTk interpreter
Nift has an ExprTk interpreter that you can start with either nsm interp -exprtk or nift interp -exprtk.
In Nift's interpreter mode the prompt will just display the language. If you would like the prompt to also display the present working directory (up to using half the width of the console) you can switch to the shell mode using nsm_mode('sh'). You can switch back again with nsm_mode('interp').
You can switch to one of the other languages available in Nift's interpreter using nsm_lang('langStr') where langStr is one of f++, N++, lua or exprtk.
Running ExprTk scripts
If you have an ExprTk script saved in a file path/script-name.exprtk you can run it with either of the following:
nsm run path/script-name.exprtk nift run path/script-name.exprtk
If the script has a different extension, say .ext, you can run the script with either of the following:
nsm run -exprtk path/script-name.ext nift run -exprtk path/script-name.ext
ExprTk from f++
You can run ExprTk code from f++ using any of the following (without needing the comment syntax):
exprtk
{
// block of ExprTk code
}
ExprTk from n++
You can run ExprTk code from N++ using any of the following (without needing the comment syntax):
@exprtk
{
// block of ExprTk code
}
ExprTk with f++/N++ conditions
You can use ExprTk with conditions for if, else-if and else statements, along with do-while, for, while loops. You can also use ExprTk for the post-loop increment code with for loops (ie. the code after the second ;). For example:
for(int i=0; i<10; i+=1)
console("i: ", i)
ExprTk access to Nift variables
ExprTk has access to Nift variables of the following types: bool, int, double, char, string and std::vector<double>. You can simply use the variables as if they had been defined inside ExprTk, although a char is treated as a string, and a bool or an int is treated as a double.
Nift functions
The following functions specific to Nift are available inside ExprTk code.
| syntax | example | about |
|---|---|---|
| cd(string) | cd('~/') | change directory |
| sys(string) | sys('ls *.txt') | execute system call/command |
| to_string(double) | to_string(10) | convert double to string |
| nsm_setnumber(string, number) | nsm_setnumber('i', 0) | set Nift variable from number |
| nsm_setstring(string, string) | nsm_setstring('str', 'hello!') | set Nift variable from string |
| nsm_tonumber(string) | nsm_tonumber('i') | get number from Nift variable |
| nsm_tostring(string) | nsm_tostring('str') | get string from Nift variable |
| nsm_write(ostream, params) | nsm_write(console, 'x: ', x, endl) | write to console, output file (ofile), or a stream |
| syntax | example | about |
Benchmark results
Results from The Great C++ Mathematical Expression Parser Benchmark are below:
Scores: # Parser Type Points Score Failures ----------------------------------------------------------------------- 00 ExprTk double 901 100 0 01 ExprTkFloat float 740 82 9 02 muparserSSE float 726 93 9 03 METL double 686 52 0 04 FParser 4.5 double 584 43 0 05 atmsp 1.0.4 double 530 38 2 06 muparser 2.2.4 double 517 37 0 07 muparser 2.2.4 (omp) double 444 35 0 08 MTParser double 381 34 0 09 MathExpr double 360 29 2 10 TinyExpr double 354 31 2 11 Lepton double 134 8 2 12 muparserx double 86 5 0