import type { VmValue } from '@mirascript/mirascript'; import type { EvalExpressionCache, ExpressionCache } from './parser.js'; import { Scope, unwrap } from './scope.js'; import type { Evaluator } from './main.js'; /** * 表达式求值 */ export function evaluateEval( evaluator: Evaluator | null, expression: EvalExpressionCache, scope: Scope, ): T | null { try { const result = expression.func(scope.proxy); if (result == null) return null; return unwrap(result as T); } catch (error: unknown) { if (scope.throws) throw error; (evaluator?.logger ?? console).warn( `Failed to execute expression "${expression.source}": ${(error as Error).message || String(error)}.`, { error, scope, }, ); return null; } } /** * 表达式求值 */ export function evaluate( evaluator: Evaluator | null, expression: ExpressionCache, scope: Scope, ): T | null { let ret: T | null = null; if (expression.func != null) { scope ??= new Scope(); const reset = scope.reset(evaluator); try { ret = evaluateEval(evaluator, expression, scope); } finally { reset(); } } else if (expression.error != null) { if (scope.throws) { throw expression.error; } } if (ret == null) return null; return ret; }