如何在Rust中创建自引用AST?

whhtz7ly  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(138)

让我们想象一下,我们有一个非常简单的AST编程语言,只有函数和调用

use std::sync::Arc;

struct Function {
    pub body: Vec<Call>
}

struct Call {
    pub function: Arc<Function> 
}

现在我们要递归调用函数:
x一个一个一个一个x一个一个二个x
可以使用Arc<Mutex<_>>Call中的Arc<RwLock<_>>来解决该问题:

use std::sync::{Arc, RwLock}

struct Call {
    pub function: Arc<RwLock<Function>> 
}

然后创建:

let f = Arc::new(RwLock::new(Function { body: vec![] }));
f.write().unwrap().body.push(Call { function: f.clone() })

但是现在你需要在任何地方都写f.write().unwrap()f.read().unwrap(),即使函数是可变的只在构造时
你能做点比这更好的吗?

6qfn3psc

6qfn3psc1#

使用Weak作为父指针。无论如何,您都需要这样做以允许正确的销毁。然后使用Arc::new_cyclic()

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

struct Function {
    pub body: Vec<Call>,
}

struct Call {
    pub function: Weak<Function>,
}

let f = Arc::new_cyclic(|f| Function {
    body: vec![Call {
        function: Weak::clone(f),
    }],
});

相关问题