sandwich

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

commit 0355142103f573d22b1796f048958f06c3af70a0
parent 1a811c650f8943ee1df22b40308f6891f14ce6a5
Author: ~karx <karx@tilde.team>
Date:   Mon,  8 Feb 2021 15:30:20 +0000

Implement functions

Diffstat:
Msrc/main.rs | 47++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 46 insertions(+), 1 deletion(-)

diff --git a/src/main.rs b/src/main.rs @@ -90,13 +90,58 @@ impl Program { println!("{:?}", self.funcs); } + fn parse_funcs(&mut self, instruction: &String) -> u32 { + // Opcode is the first character, arguments are everything after the first char + let opcode = instruction.chars().collect::<Vec<char>>()[0]; + let arguments = &instruction[1..]; + + // Only a subset of opcodes, because the others don't make sense in a function + match opcode { + 'a' => eval::do_math(self.args_or_vars(arguments), '+'), + 's' => eval::do_math(self.args_or_vars(arguments), '-'), + 'm' => eval::do_math(self.args_or_vars(arguments), '*'), + 'd' => eval::do_math(self.args_or_vars(arguments), '/'), + 'l' => {self.add_var(arguments);0} + _ => panic!("SyntaxError: No such opcode: {}", self.pc), + } + } + + fn args_or_funcs(&mut self, arguments: &str) -> String { + let mut builder = String::from(""); + let argument_vec: Vec<char> = arguments.chars().collect(); + + for index in 0..argument_vec.len() { + let current_char = argument_vec[index]; + let str_to_push: String; + + if current_char == '*' { + let func_name = argument_vec[index+1]; + let body: String; + + let key = (self).funcs.get(&func_name); + match key { + Some(content) => body = content.to_owned(), + None => panic!("ValueError: function {} has not been defined yet!", func_name) + } + + str_to_push = self.parse_funcs(&body).to_string(); + } else { + str_to_push = current_char.to_string(); + } + + builder.push_str(&str_to_push); + } + + builder + } + fn parse(&mut self, instruction: &String) { // Opcode is the first character, arguments are everything after the first char let opcode = instruction.chars().collect::<Vec<char>>()[0]; let arguments = &instruction[1..]; match opcode { - 'p' => println!("{}", self.args_or_vars(arguments)), + 'p' => println!("{}", self.args_or_funcs(&self.args_or_vars(arguments))), 'a' => println!("{}", eval::do_math(self.args_or_vars(arguments), '+')), 's' => println!("{}", eval::do_math(self.args_or_vars(arguments), '-')), 'm' => println!("{}", eval::do_math(self.args_or_vars(arguments), '*')),