Initialize Aster project with basic structure, including Cargo configuration, lexer, parser, interpreter, and AST definitions. Add a sample script and README documentation. Implement basic error handling and environment management for variable storage.

This commit is contained in:
0264408
2026-02-04 16:42:51 +08:00
commit f86300f3ce
19 changed files with 1484 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
use super::Value;
use std::collections::HashMap;
use std::rc::Rc;
use std::cell::RefCell;
#[derive(Debug)]
pub struct Env {
pub values: HashMap<String, Value>,
pub parent: Option<Rc<RefCell<Env>>>,
}
impl Env {
pub fn new(parent: Option<Rc<RefCell<Env>>>) -> Self {
Self {
values: HashMap::new(),
parent,
}
}
pub fn define(&mut self, name: String, val: Value) {
self.values.insert(name, val);
}
pub fn assign(&mut self, name: &str, val: Value) -> bool {
if self.values.contains_key(name) {
self.values.insert(name.to_string(), val);
true
} else if let Some(parent) = &self.parent {
parent.borrow_mut().assign(name, val)
} else {
false
}
}
pub fn get(&self, name: &str) -> Option<Value> {
if let Some(val) = self.values.get(name) {
Some(val.clone())
} else if let Some(parent) = &self.parent {
parent.borrow().get(name)
} else {
None
}
}
}