如何递归调用存储在Arc <Mutex <_ >>中的闭包?

时间:2019-08-14 16:06:18

标签: recursion rust reference-counting

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

我尝试使用Arc<Mutex<dyn FnMut>>,但是它不支持递归。

use std::sync::{Arc, Mutex};

type Data = Arc<DataUnpack>;
enum DataUnpack {
    Number(f64),
    Function(Box<Mutex<FnMut(Vec<Data>) -> Data>>),
}

fn call(f: Data, args: Vec<Data>) -> Data {
    if let DataUnpack::Function(v) = &*f {
        let f = &mut *v.lock().unwrap();
        f(args)
    } else {
        panic!("TYPE ERR")
    }
}

fn lambda(f: Box<FnMut(Vec<Data>) -> Data>) -> Data {
    Arc::new(DataUnpack::Function(Box::new(Mutex::new(Box::leak(f)))))
}

fn main() {
    let f: Arc<Mutex<Data>> = Arc::new(Mutex::new(Arc::new(DataUnpack::Number(0.0))));
    *f.lock().unwrap() = {
        let f = f.clone();
        lambda(Box::new(move |xs| {
            println!("Ha");
            call(f.lock().unwrap().clone(), xs.clone())
        }))
    };
    call(f.lock().unwrap().clone(), vec![]);
}

playground

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

0 个答案:

没有答案