// 表达式函数解析,为突破小程序不支持js实现的折中方案 function evaluate(env, expr) { const tokens = expr.split(/(?![^(]*\)),/); // 分割外层参数,忽略内层逗号 return tokens.map((token) => { if (token.trim().startsWith('\'') && token.trim().endsWith('\'')) { // 处理字符串字面量 return token.trim().slice(1, -1); } else if (/^[0-9]+(\.[0-9]+)?$/.test(token.trim())) { // 处理数字字面量 return parseFloat(token); } else if (/^[A-Za-z_]\w*\(/.test(token.trim())) { // 处理函数调用 const fnName = token.trim().substring(0, token.indexOf('(')); const args = token.trim().slice(token.indexOf('(') + 1, -1); // 提取参数部分 if (!(fnName in env)) { throw new Error(`Function '${fnName}' is not defined`); } return env[fnName](...evaluate(env, args)); } else { // 处理变量 if (!(token.trim() in env)) { throw new Error(`Variable '${token.trim()}' is not defined`); } return env[token.trim()]; } }); } export function interpret(env, expression) { if (!/^[A-Za-z_]\w*\(/.test(expression)) { throw new Error('Expression must start with a function call'); } const fnName = expression.substring(0, expression.indexOf('(')); const argsString = expression.substring(expression.indexOf('(') + 1, expression.lastIndexOf(')')); if (!(fnName in env)) { throw new Error(`函数 '${fnName}' 未定义`); } const args = evaluate(env, argsString); try { return env[fnName](...args); } catch (e) { throw new Error(`执行错误 '${fnName}': ${e.message}`); } } export default { interpret }