今天遇到一个typescript动态计算表达式的问题,于是问了下GPT,得到math-expression-evaluator。看了下代码量比mathjs小一点,下载量也比mathjs高,于是想试试。
写个简单的x+y,居然不断报错。整了半天没弄明白,连google也找不到对应的参数化方法,很是蛋疼。居然不断报错:
Error: Can't understand after XXXX
最后只能看到官方的例子test。发现一个简单的参数化x+y居然要这这样写:
const expressionParam: Record<string, number> = {}const mexp = new Mexp()expressionParam.x = 3expressionParam.y = 5console.log('x + y =',mexp.eval('x + y',[{ token: 'x', show: 'x', type: 3, precedence: 3, value: 'x' },{ token: 'y', show: 'y', type: 3, precedence: 3, value: 'y' }],expressionParam))
输出:x + y = 8
OMG,复杂得有点反人类好吧。
仔细研究下test,发现还是做了很多优化,支持自定义表达式语法:
console.log('maxof5(7, 12, 23, 33, 2)=',mexp.eval('maxof5(7, 12, 23, 33, 2)',[{type: Mexp.tokenTypes.FUNCTION_WITH_N_ARGS,token: 'maxof5',show: 'maxof5',numberOfArguments: 5,value: function (a, b, c, d, e) {return Math.max(a, b, c, d, e)},precedence: Mexp.tokenTypes.FUNCTION_WITH_N_ARGS}],expressionParam))
输出:maxof5(7, 12, 23, 33, 2)= 33
这样我们可以动态的内置一些表达式在计算语法里,缩短计算语法的长度。实现一些自定义功能