sandwich

A funny programming language written in Rust
git clone https://tilde.team/~karx/sandwich.git
Log | Files | Refs | README | LICENSE

commit 026466efac656fd82a2c1d260336e5aa8793b144
parent 088741aba433b60d4077d074d9f5e1112076a674
Author: ~karx <karx@tilde.team>
Date:   Sun,  7 Feb 2021 17:18:15 +0000

Make variable notation explicit

Diffstat:
Msrc/main.rs | 37++++++++++++++++++++++++++++---------
1 file changed, 28 insertions(+), 9 deletions(-)

diff --git a/src/main.rs b/src/main.rs @@ -28,19 +28,38 @@ impl Program { return Program{ data: op_list, pc: 0, vars: HashMap::new() }; } - fn args_or_vars<'a>(&self, arguments: &'a str) -> String { - let mut deconstructed: Vec<char> = arguments.chars().collect(); + fn args_or_vars(&self, arguments: &str) -> String { + let mut builder = String::from(""); + let argument_vec: Vec<char> = arguments.chars().collect(); - for (index, char) in arguments.chars().enumerate() { - let value = self.vars.get(&char); + for index in 0..argument_vec.len() { + let current_char = argument_vec[index]; + let str_to_push: String; - match value { - Some(content) => deconstructed[index] = *content, - None => {} + if index > 0 { + if argument_vec[index-1] == '$' { + continue; + } + } + + if current_char == '$' { + let variable = argument_vec[index+1]; + + let key = self.vars.get(&variable); + match key { + Some(value) => str_to_push = value.to_string(), + None => panic!("NotFoundError: Variable {} has not been defined", variable) + } + + } else { + str_to_push = current_char.to_string(); } + + + builder.push_str(&str_to_push); } - deconstructed.into_iter().collect() + builder } fn add_var(&mut self, arguments: &str) { @@ -60,7 +79,7 @@ impl Program { 'm' => println!("{}", eval::do_math(self.args_or_vars(arguments), '*')), 'd' => println!("{}", eval::do_math(self.args_or_vars(arguments), '/')), 'l' => self.add_var(arguments), - _ => panic!("SyntaxError at opcode {}!", self.pc) + _ => panic!("SyntaxError: No such opcode: {}", self.pc) } }