Add variable-to-variable assignment

main
Elnu 1 year ago
parent 01173d2f7d
commit 4bf6e7b820

@ -6,7 +6,9 @@ if True:
"Bob will be here in [x] seconds." "Bob will be here in [x] seconds."
if True: if True:
x = "1" x = "1"
let x = "4" let y = "4"
y = "5"
x = y
"[x]" "[x]"
"Bob will be here in [x] seconds." "Bob will be here in [x] seconds."
"Bob will be here in [x] seconds." "Bob will be here in [x] seconds."

@ -37,12 +37,20 @@ impl CommandContext {
assign_type, assign_type,
variable, variable,
value, value,
} => match assign_type { } => {
let value = if let Token::Keyword(keyword) = value {
self.context
.borrow()
.get_variables()
.get(keyword)
.unwrap_or_else(|| panic!("undefined variable `{keyword}`"))
.clone()
} else {
value.clone()
};
match assign_type {
Define => panic!("define command should not be executed at runtime!"), Define => panic!("define command should not be executed at runtime!"),
GlobalAssign => { GlobalAssign => {
if let Token::Keyword(_) = value {
todo!("assignment variable interpolation isn't implemented");
}
let root = self.context.borrow().get_root(&self.context); let root = self.context.borrow().get_root(&self.context);
// Don't want to re-borrow if root is self // Don't want to re-borrow if root is self
let root = if Rc::ptr_eq(&self.context, &root) { let root = if Rc::ptr_eq(&self.context, &root) {
@ -58,9 +66,6 @@ impl CommandContext {
return None; return None;
} }
Let => { Let => {
if let Token::Keyword(_) = value {
todo!("assignment variable interpolation isn't implemented");
}
self.context self.context
.borrow() .borrow()
.variables .variables
@ -69,9 +74,6 @@ impl CommandContext {
return None; return None;
} }
Assign => { Assign => {
if let Token::Keyword(_) = value {
todo!("assignment variable interpolation isn't implemented");
}
let mut block_option = Some(self.context.clone()); let mut block_option = Some(self.context.clone());
let mut modified = false; let mut modified = false;
while let Some(block) = block_option { while let Some(block) = block_option {
@ -94,6 +96,7 @@ impl CommandContext {
} }
return None; return None;
} }
}
}, },
Eat { .. } => return None, Eat { .. } => return None,
} }

Loading…
Cancel
Save