https://github.com/Yardanico/nim-mathexpr
This is a mathematic expression evaluator library in pure Nim (with no third-party dependencies).
Basically it is a recursive descent evaluator.
It supports many mathematical functions, also you can provide variables and add custom functions.
Also it doesn't have strict rules on arguments, so all of these are valid:
sqrt(max(1, 2))
sqrt(max(1 2))
sqrt max(1, 2)
sqrt max(1 2)
# You can even do something like this!
sqrt fac log2 10
Example REPL:
## An example REPL for Mathexpr:
import strutils, rdstdin, tables, mathexpr
# Our variables (they will be available in the REPL)
var ourVars = {"x": 5.0, "y": 6.0, "z": 75.0}.newTable()
# Procedure should have this type:
# proc(args: seq[float]): float
proc mySum(args: seq[float]): float =
for arg in args: result += arg
# Add our custom `sum` function
mathexpr.functions["sum"] = mySum
while true:
var expr: string
try:
expr = readLineFromStdin("> ")
except IOError:
echo "Goodbye!"
quit()
if expr in ["exit", "quit", "quit()", "exit()"]:
quit(0)
try:
let result = eval(expr, ourVars)
echo "$1 = $2" % [expr, $result]
except:
echo getCurrentExceptionMsg()
continue
By the way, implementation is less than 200 lines and it works in JS backend :)
Wanted to bump this thread - I finally did proper documentation and tidied the code a bit, docs at https://yardanico.github.io/nim-mathexpr/mathexpr.html
nimble instal mathexpr
to install latest release.
It's a bit more lines now, but it has more features :) and still works with all nim backends including JS and VM