///| 函数管理模块
///| 处理函数定义、调用和参数绑定
///| 绑定函数参数到作用域
///| 递归处理多个参数,将参数值绑定到函数作用域中
///| 支持所有参数类型:位置参数、标签参数、可选参数、问号可选参数、丢弃参数
pub fn ClosureInterpreter::bind_function_parameters(
self : ClosureInterpreter,
params : @list.List[@syntax.Parameter],
args : @list.List[@syntax.Argument],
) -> Unit {
match (params, args) {
(@list.More(param, tail=rest_params), @list.More(arg, tail=rest_args)) => {
let arg_value = self.visit(arg.value)
match param {
// 位置参数:直接绑定参数值
@syntax.Parameter::Positional(binder={ name, .. }, ..) =>
self.immutable_values.last().unwrap().set(name, arg_value)
// 标签参数:绑定带标签的参数值
@syntax.Parameter::Labelled(binder={ name, .. }, ..) =>
self.immutable_values.last().unwrap().set(name, arg_value)
// 可选参数:当有参数提供时绑定参数值,否则使用默认值
@syntax.Parameter::Optional(binder={ name, .. }, ..) =>
self.immutable_values.last().unwrap().set(name, arg_value)
// 问号可选参数:绑定参数值
@syntax.Parameter::QuestionOptional(binder={ name, .. }, ..) =>
self.immutable_values.last().unwrap().set(name, arg_value)
// 丢弃位置参数:不绑定到任何变量,直接跳过
@syntax.Parameter::DiscardPositional(..) =>
// 丢弃参数不需要绑定,但仍需要求值以保持副作用
self.visit(arg.value) |> ignore
}
self.bind_function_parameters(rest_params, rest_args)
}
// 处理可选参数的默认值情况
(@list.More(param, tail=rest_params), @list.Empty) =>
match param {
// 可选参数没有对应实参时,使用默认值
@syntax.Parameter::Optional(binder={ name, .. }, default~, ..) => {
let default_value = self.visit(default)
self.immutable_values.last().unwrap().set(name, default_value)
self.bind_function_parameters(rest_params, @list.new())
}
// 问号可选参数没有对应实参时,不绑定任何值
@syntax.Parameter::QuestionOptional(..) =>
self.bind_function_parameters(rest_params, @list.new())
_ => ()
}
_ => ()
}
}
///| 执行函数调用
///| 处理用户定义函数的调用,包括作用域管理和参数绑定
pub fn ClosureInterpreter::execute_function_call(
self : ClosureInterpreter,
function : @syntax.Func,
args : @list.List[@syntax.Argument],
) -> @syntax.Expr {
match function {
@syntax.Func::Lambda(parameters~, body~, ..) => {
// 创建新的作用域
self.push_scope()
// 绑定参数
self.bind_function_parameters(parameters, args)
// 执行函数体
let result = self.visit(body)
// 恢复作用域
self.pop_scope()
result
}
_ =>
// 返回Unit表达式作为默认值
unit()
}
}
///| 处理函数定义
///| 将函数存储到用户函数映射中
pub fn define_function(
user_functions : Map[String, @syntax.Func],
name : String,
func : @syntax.Func,
) -> Unit {
user_functions.set(name, func)
}
///|
pub fn define_struct_method(
struct_methods : Map[String, Map[String, @syntax.Func]],
type_name : String,
method_name : String,
func : @syntax.Func,
) -> Unit {
if !struct_methods.contains(type_name) {
struct_methods.set(type_name, Map::new())
}
struct_methods.get(type_name).unwrap().set(method_name, func)
}
///| 查找用户定义的函数
pub fn ClosureInterpreter::find_user_function(
self : ClosureInterpreter,
name : String,
) -> @syntax.Func? {
// 从当前作用域开始查找
for i in 0..