Recursion 如何递归调用存储在Arc中的闭包<;互斥锁<_&燃气轮机>;?

Recursion 如何递归调用存储在Arc中的闭包<;互斥锁<_&燃气轮机>;?,recursion,rust,reference-counting,Recursion,Rust,Reference Counting,我正在尝试将动态语言转换为Rust,闭包是最难实现的部分 我尝试过使用Arc,但它不支持递归 使用std::sync::{Arc,Mutex}; 类型数据=弧; 枚举数据解包{ 编号(f64), 功能(框>), } fn调用(f:Data,args:Vec)->Data{ 如果让数据解包::函数(v)=&*f{ 设f=&mut*v.lock().unwrap(); f(args) }否则{ 恐慌!(“类型错误”) } } fn lambda(f:框数据>)->数据{ Arc::new(DataU

我正在尝试将动态语言转换为Rust,闭包是最难实现的部分

我尝试过使用
Arc
,但它不支持递归

使用std::sync::{Arc,Mutex};
类型数据=弧;
枚举数据解包{
编号(f64),
功能(框>),
}
fn调用(f:Data,args:Vec)->Data{
如果让数据解包::函数(v)=&*f{
设f=&mut*v.lock().unwrap();
f(args)
}否则{
恐慌!(“类型错误”)
}
}
fn lambda(f:框数据>)->数据{
Arc::new(DataUnpack::Function(Box::new(Mutex::new)(Box::leak(f ')))
}
fn main(){
设f:Arc=Arc::new(Mutex::new(Arc::new(DataUnpack::Number(0.0)));
*f、 锁定()。展开(){
设f=f.clone();
lambda(框::新(移动| xs |{
println!(“Ha”);
调用(f.lock().unwrap().clone(),xs.clone())
}))
};
调用(f.lock().unwrap().clone(),vec![]);
}


它显示一个
Ha
,然后停止。我错在哪里?

您似乎试图同时锁定互斥锁两次,这会造成死锁。你为什么这么做?你为什么把
框泄漏出去
?为什么在main中将
f
设置为一个数字,然后覆盖它?
Box::leak
在这里似乎没有必要。实际上,整个内部的
框就是这样。(也就是说,它会死锁)。我打赌
Box::leak
是解决
Box
在1.35之前的Rust版本中未实现
FnMut
的一种方法。虽然
为什么会在那里,但我不确定。您似乎试图同时锁定互斥锁两次,这会造成死锁。你为什么这么做?你为什么把
框泄漏出去
?为什么在main中将
f
设置为一个数字,然后覆盖它?
Box::leak
在这里似乎没有必要。实际上,整个内部的
框就是这样。(也就是说,它会死锁)。我打赌
Box::leak
是解决
Box
在1.35之前的Rust版本中未实现
FnMut
的一种方法。虽然
为什么会在那里,但我不确定。