import type { FunctionAssignmentNode } from 'mathjs'; import type { Result } from './interface.js'; import { migrateAtomic } from './node.js'; import { type State, FunctionState } from './state.js'; import { migrateSymbolName } from './utils.js'; /** 转换函数定义语句 */ export function migrateFunctionAssignment(state: State, node: FunctionAssignmentNode): Result { state.loose(); const { name, params, expr } = node; const fState = new FunctionState(state, params); let body = migrateAtomic(fState, expr); if (!(body.code.startsWith('{') && body.code.endsWith('}'))) { body = { ...body, code: `{ ${body.code} }` }; } if (state.locals.has(name)) { state.err(`重复定义函数: '${name}'`); } state.locals.set(name, { type: 'function', code: body.code, }); return { type: 'function', code: `fn ${migrateSymbolName(name, true)}(${params.join(', ')}) ${body.code}`, }; }