///|
struct ClosureInterpreter {
extern_fns : Map[String, (@list.List[@syntax.Expr]) -> @syntax.Expr]
// embedded函数存储 - 全局函数
embedded_fns : Map[String, (@list.List[@syntax.Expr]) -> @syntax.Expr]
// embedded方法存储 - 按类型组织的embedded方法定义
embedded_methods : Map[
String,
Map[String, (@list.List[@syntax.Expr]) -> @syntax.Expr],
]
// 函数别名存储 - 存储函数名到其实际实现的映射
fn_aliases : Map[String, String]
// 性能优化:区分可变和不可变变量
immutable_values : Array[Map[String, @syntax.Expr]]
mutable_values : Array[Map[String, @syntax.Expr]]
// 用户定义的函数
user_functions : Array[Map[String, @syntax.Func]]
// 类型定义
type_definitions : Map[String, @syntax.TypeDecl]
// 结构体方法定义 - 按类型名组织方法
struct_methods : Map[String, Map[String, @syntax.Func]]
}
///|
pub fn ClosureInterpreter::new() -> ClosureInterpreter {
{
extern_fns: Map::new(),
embedded_fns: Map::new(),
embedded_methods: Map::new(),
fn_aliases: Map::new(),
immutable_values: [{}],
mutable_values: [{}],
user_functions: [{}],
type_definitions: Map::new(),
struct_methods: Map::new(),
}
}
///|
pub fn ClosureInterpreter::add_extern_fn(
self : ClosureInterpreter,
name : String,
f : (@list.List[@syntax.Expr]) -> @syntax.Expr,
) -> Unit {
self.extern_fns.set(name, f)
}
///|
pub fn ClosureInterpreter::add_embedded_fn(
self : ClosureInterpreter,
name : String,
f : (@list.List[@syntax.Expr]) -> @syntax.Expr,
) -> Unit {
self.embedded_fns.set(name, f)
}
///|
pub fn ClosureInterpreter::add_embedded_method(
self : ClosureInterpreter,
type_name : String,
method_name : String,
f : (@list.List[@syntax.Expr]) -> @syntax.Expr,
) -> Unit {
if not(self.embedded_methods.contains(type_name)) {
self.embedded_methods.set(type_name, Map::new())
}
self.embedded_methods.get(type_name).unwrap().set(method_name, f)
}
///| 获取当前函数作用域
fn ClosureInterpreter::current_user_function_scope(
self : ClosureInterpreter,
) -> Map[String, @syntax.Func] {
// user_functions 数组永远非空(初始化为 [{}]),直接访问最后一个元素
self.user_functions[self.user_functions.length() - 1]
}
///| 获取当前不可变变量作用域
fn ClosureInterpreter::current_immutable_scope(
self : ClosureInterpreter,
) -> Map[String, @syntax.Expr] {
// immutable_values 数组永远非空(初始化为 [{}]),直接访问最后一个元素
self.immutable_values[self.immutable_values.length() - 1]
}
///|
fn ClosureInterpreter::find(
self : ClosureInterpreter,
name : String,
) -> @syntax.Expr {
find_variable(self.immutable_values, self.mutable_values, name)
}
///|
fn ClosureInterpreter::top_visit(
self : ClosureInterpreter,
node : @syntax.Impl,
) -> Unit {
match node {
// TopView(_) => ...
// TopImpl(_) => ...
// TopBatchTraitAlias(_) => ...
// TopBatchTypeAlias(_) => ...
// TopTrait(_) => ...
// TopFuncAlias(_) =>
// 处理顶层常量定义(如 const Zero = 0)
TopLetDef(binder~, expr~, ..) => {
let name = binder.name
let evaluated_expr = self.visit(expr)
self.set_immutable_variable(name, evaluated_expr)
}
TopTypeDef(def) =>
match def {
{ tycon, .. } => self.type_definitions.set(tycon, def)
}
// 处理顶层函数定义,包括结构体方法和embedded函数
TopFuncDef(fun_decl~, decl_body~, loc~) => {
// 从fun_decl中提取函数名
let func_name = fun_decl.name.name
let type_name = match fun_decl.type_name {
Some({ name: Ident(name=type_name), .. }) => Some(type_name)
Some({ name: Dot(..), .. }) => None // 处理点号形式的类型名
None => None
}
// 从decl_body中提取函数体
match decl_body {
DeclBody(local_types=_, expr~) => {
let func = @syntax.Func::Lambda(
parameters=fun_decl.decl_params.unwrap_or(@list.new()),
params_loc=loc,
body=expr,
return_type=fun_decl.return_type,
error_type=fun_decl.error_type,
kind=Arrow,
has_error=fun_decl.has_error,
is_async=fun_decl.is_async,
loc~,
)
if type_name is Some(type_name) {
self.define_struct_method(type_name, func_name, func)
} else {
self.define_function(func_name, func)
}
}
// 处理embedded函数声明
DeclStubs(stubs) =>
match stubs {
Embedded(code=@syntax.EmbeddedCode::CodeString(code_str), ..) => {
let func = self.embedded_fns.get(code_str)
if (type_name, func) is (Some(type_name), Some(func)) {
self.add_embedded_method(type_name, func_name, func)
}
}
_ => ()
}
}
}
_ => ()
}
// TopTest(_) => ...
// TopExpr(_) => ...
// TopImplRelation(_) => ...
}
///|
fn ClosureInterpreter::visit(
self : ClosureInterpreter,
node : @syntax.Expr,
) -> @syntax.Expr {
// @basic.show_loc.val = true
let loc = node.loc()
let unit = () => @syntax.Expr::Unit(loc~, faked=true)
match node {
// 处理常量
Constant(c~, ..) => Constant(c~, loc~)
// 处理中缀表达式(如 1+1)
Infix(op~, lhs~, rhs~, ..) =>
// 检查操作符
match op.name {
Ident(name~) =>
match (self.visit(lhs), self.visit(rhs)) {
(Constant(c=l, ..), Constant(c=r, ..)) =>
Constant(c=constant_infix(name, l, r), loc~)
_ => unit()
}
_ => unit()
}
// Handle unary expressions (like !false)
Unary(op~, expr~, ..) =>
match op.name {
Ident(name~) =>
match (name, self.visit(expr)) {
// Handle logical not operator
("!", Constant(c=Bool(value), ..)) => Constant(c=Bool(!value), loc~)
// Handle numeric negation
("-", Constant(c=constant, ..)) =>
match constant {
Int(value) =>
Constant(
c=Int(
(-(@strconv.parse_int(value) catch { _ => 0 })).to_string(),
),
loc~,
)
Double(value) =>
Constant(
c=Double(
(-(@strconv.parse_double(value) catch { _ => 0.0 })).to_string(),
),
loc~,
)
_ => unit()
}
_ => unit()
}
_ => unit()
}
// 处理不可变变量(性能优化:存储到专门的不可变变量数组)
Let(pattern=@syntax.Pattern::Var({ name, .. }), expr~, ..) => {
let evaluated_expr = self.visit(expr)
self.set_immutable_variable(name, evaluated_expr)
unit()
}
// 处理可变变量声明(存储到专门的可变变量数组)
LetMut(binder={ name, .. }, expr~, ..) => {
let evaluated_expr = self.visit(expr)
self.set_mutable_variable(name, evaluated_expr)
unit()
}
// 处理函数定义
LetFn(name={ name, .. }, func~, body~, loc~) => {
self.define_function(name, func)
// 如果body是Unit表达式,说明没有后续表达式,返回函数签名
match body {
Unit(..) => Function(func~, loc~)
_ => self.visit(body)
}
}
// 处理赋值操作(性能优化:只在可变变量中查找和更新)
Assign(var_~, expr~, augmented_by~, ..) =>
match var_.name {
@syntax.LongIdent::Ident(name~) => {
let new_value = match augmented_by {
Some(op) => {
// 增强赋值操作(如 +=, -=, *=, /= 等)
let current_value = self.find(name)
match op.name {
Ident(name~) => {
let rhs_value = self.visit(expr)
match (current_value, rhs_value) {
(Constant(c=l, ..), Constant(c=r, ..)) =>
@syntax.Expr::Constant(c=constant_infix(name, l, r), loc={
start: { fname: "", lnum: 0, bol: 0, cnum: 0 },
end: { fname: "", lnum: 0, bol: 0, cnum: 0 },
})
_ => self.visit(expr)
}
}
_ => self.visit(expr)
}
}
None =>
// 普通赋值操作
self.visit(expr)
}
update_mutable_variable(self.mutable_values, name, new_value)
|> ignore
unit()
}
_ => unit()
}
// Handle variable identifiers
Ident(id={ name, .. }, ..) =>
match name {
@syntax.LongIdent::Ident(name~) => self.find(name)
_ => unit()
}
// 处理函数调用
Apply(func~, args~, ..) =>
match func {
Ident(id={ name: Ident(name~), .. }, ..) =>
self.execute_function_by_name(name, args)
_ => unit()
}
// Handle if expressions
If(cond~, ifso~, ifnot~, ..) =>
match self.visit(cond) {
Constant(c=@syntax.Constant::Bool(value), ..) =>
if value {
self.visit(ifso)
} else if ifnot is Some(ifnot) {
self.visit(ifnot)
} else {
unit()
}
_ => unit()
}
// Handle while loops
While(loop_cond~, loop_body~, ..) => {
let mut result = unit()
// 循环执行
while true {
// 检查循环条件
let condition_result = self.visit(loop_cond)
let should_continue = match condition_result {
Constant(c=@syntax.Constant::Bool(value), ..) => value
_ => false // 如果条件不是布尔值,停止循环
}
if not(should_continue) {
break
}
// 执行循环体
result = self.visit(loop_body)
}
result
}
// Handle for loops
For(binders~, condition~, continue_block~, body~, ..) => {
// 创建新的作用域
self.push_scope()
// 初始化循环变量
for binder_init in binders {
match binder_init {
(binder, init_expr) => {
let init_value = self.visit(init_expr)
self.set_mutable_variable(binder.name, init_value)
}
}
}
// 执行循环
let mut result = unit()
// 循环执行
while true {
// 检查条件
let should_continue = match condition {
Some(cond) => {
let condition_result = self.visit(cond)
match condition_result {
Constant(c=@syntax.Constant::Bool(value), ..) => value
_ => false
}
}
None => true // 如果没有条件,执行一次
}
if not(should_continue) {
break
}
// 执行循环体
result = self.visit(body)
// 执行continue块(更新循环变量)
for continue_update in continue_block {
match continue_update {
(binder, update_expr) => {
let new_value = self.visit(update_expr)
update_mutable_variable(
self.mutable_values,
binder.name,
new_value,
)
|> ignore
}
}
}
}
// 恢复作用域
self.pop_scope()
result
}
// Handle Function expressions (Lambda functions)
Function(func~, ..) =>
// 直接返回Function表达式,它将作为一个值存储
Function(func~, loc~)
// Handle group expressions (parentheses)
Group(expr~, ..) => self.visit(expr)
// Handle sequence expressions (multiple statements)
Sequence(exprs~, last_expr~, ..) => {
// 执行所有前面的表达式(副作用)
for expr in exprs {
self.visit(expr) |> ignore
}
// 返回最后一个表达式的值
self.visit(last_expr)
}
// Handle record creation
Record(type_name~, fields~, trailing~, ..) => {
let inferred_type_name = match type_name {
Some(tn) => Some(tn)
None => None
}
Record(type_name=inferred_type_name, fields~, trailing~, loc~)
}
// Handle field access
Field(record~, accessor~, ..) => {
let evaluated_record = self.visit(record)
match (evaluated_record, accessor) {
(Record(fields~, ..), @syntax.Accessor::Label(label)) => {
// 在记录的字段中查找匹配的标签
for field in fields {
// 根据JSON结构,FieldDef有label和expr字段
if field.label.name == label.name {
return self.visit(field.expr)
}
}
unit() // 如果没有找到字段,返回unit
}
_ => unit() // 如果不是记录或访问器不匹配,返回unit
}
}
// Handle method calls (DotApply)
DotApply(self=self_expr, method_name~, args~, ..) =>
// 查找结构体方法
self.execute_method_call(self_expr, method_name.name, args)
// Handle match expressions
Match(expr~, cases~, ..) => {
let evaluated_expr = self.visit(expr)
self.execute_match(evaluated_expr, cases)
}
// Handle Tuple expressions
Tuple(exprs~, ..) => {
let evaluated_exprs = exprs.map(fn(expr) { self.visit(expr) })
Tuple(exprs=evaluated_exprs, loc~)
}
// Handle Array expressions
Array(exprs~, ..) => {
let evaluated_exprs = exprs.map(fn(expr) { self.visit(expr) })
Array(exprs=evaluated_exprs, loc~)
}
// Handle Record expressions
// Record(fields~, type_name~, trailing~, ..) => {
// let evaluated_fields = fields.map(fn(field) {
// @syntax.FieldDef::{
// label: field.label,
// expr: self.visit(field.expr),
// is_pun: field.is_pun,
// loc: field.loc,
// }
// })
// Record(type_name~, fields=evaluated_fields, trailing~, loc~)
// }
_ => unit()
}
}
///| 尝试执行embedded方法调用
///| 按名称执行函数调用
fn ClosureInterpreter::execute_function_by_name(
self : ClosureInterpreter,
name : String,
args : @list.List[@syntax.Argument],
) -> @syntax.Expr {
let name = self.fn_aliases.get(name).unwrap_or(name)
// 按优先级查找函数:用户函数 -> Lambda变量 -> 外部函数 -> embedded函数
match self.find_user_function(name) {
Some(function) =>
// 检查是否是embedded函数的标记函数
match function {
Lambda(body=Ident(id~, ..), ..) =>
// 提取embedded函数名
match id.name {
Ident(name=embedded_name) => {
// 这是embedded函数标记,调用对应的embedded函数
let evaluated_args = args.map(arg => self.visit(arg.value))
match self.embedded_fns.get(embedded_name) {
Some(embedded_func) => embedded_func(evaluated_args)
None => unit()
}
}
_ => self.execute_function_call(function, args)
}
_ => self.execute_function_call(function, args)
}
None => {
let var_value = self.find(name)
match var_value {
Function(func=lambda_func, ..) =>
self.execute_function_call(lambda_func, args)
_ => {
let evaluated_args = args.map(arg => self.visit(arg.value))
match self.extern_fns.get(name) {
Some(extern_func) => extern_func(evaluated_args)
None =>
// 尝试查找全局embedded函数
match self.embedded_fns.get(name) {
Some(embedded_func) => embedded_func(evaluated_args)
None => unit()
}
}
}
}
}
}
}
///| 执行结构体方法调用
fn ClosureInterpreter::execute_method_call(
self : ClosureInterpreter,
self_expr : @syntax.Expr,
method_name : String,
args : @list.List[@syntax.Argument],
) -> @syntax.Expr {
let self_type = self.find_type(self_expr)
match self.struct_methods.get(self_type) {
Some(methods) => {
let self_value = self.visit(self_expr)
match methods.get(method_name) {
Some(func) => {
// 普通函数,正常调用
let all_args = @list.construct(
@syntax.Argument::{ value: self_value, kind: Positional },
args,
)
self.execute_function_call(func, all_args)
}
None => unit()
}
}
None =>
match self.embedded_methods.get(self_type) {
Some(type_methods) =>
match type_methods.get(method_name) {
Some(embedded_method) => {
// 准备参数:self_value + 其他参数的求值结果
let evaluated_args = @list.construct(
self.visit(self_expr),
args.map(fn(arg) { self.visit(arg.value) }),
)
embedded_method(evaluated_args)
}
None => unit()
}
None => unit()
}
}
}
///| 从表达式中提取类型名称
fn ClosureInterpreter::find_type(
self : ClosureInterpreter,
expr : @syntax.Expr,
) -> String {
match expr {
// 如果是Constant表达式,根据常量类型推断
Constant(c~, ..) =>
match c {
String(_) => "String"
Int(_) => "Int"
Double(_) => "Double"
Char(_) => "Char"
Bool(_) => "Bool"
Bytes(_) => "Bytes"
_ => "Unknown"
}
// 如果是Record表达式且有显式类型名
Record(type_name=Some(type_name), ..) =>
// 根据top_visit中的模式,TypeName有name字段
match type_name {
{ name: Ident(name=type_name), .. } => type_name
_ => "Unknown"
}
// 如果是Record表达式但没有显式类型名,尝试从已定义的类型中推断
Record(type_name=None, fields~, ..) => {
// 收集当前记录的字段名
let current_fields = []
for field in fields {
current_fields.push(field.label.name)
}
// 遍历已定义的类型,寻找字段匹配的类型
let mut result = "Unknown"
self.type_definitions
.iter()
.each(fn(entry) {
let (type_name, type_def) = entry
match type_def.components {
Record(struct_fields) =>
// 检查字段是否匹配
if struct_fields.length() == current_fields.length() {
let mut all_match = true
for struct_field in struct_fields {
let mut found = false
for current_field in current_fields {
if struct_field.name.label == current_field {
found = true
break
}
}
if not(found) {
all_match = false
break
}
}
if all_match {
result = type_name
}
}
_ => ()
}
})
result
}
// 如果是Ident表达式,查找变量的值
Ident(id={ name, .. }, ..) =>
match name {
Ident(name~) => {
let var_value = self.find(name)
self.find_type(var_value)
}
_ => "Unknown"
}
// 如果是Array表达式,返回Array类型
Array(..) => "Array"
// 如果是Tuple表达式,返回Tuple类型
Tuple(..) => "Tuple"
// 如果不是已知表达式类型,返回默认类型
_ => "Unknown"
}
}