From 8b44af08baa60e66966e3c4cebbbb0c1aef37acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= Date: Sat, 31 Dec 2022 15:57:54 +0100 Subject: [PATCH] Interpreter - Initial environment implementation --- src/interpreter/environment.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/interpreter/environment.rs b/src/interpreter/environment.rs index e69de29..6b35d98 100644 --- a/src/interpreter/environment.rs +++ b/src/interpreter/environment.rs @@ -0,0 +1,29 @@ +use std::collections::HashMap; + +use crate::{errors::InterpreterError, tokens::Token}; + +use super::Value; + +/// The execution environment. +#[derive(Debug, Default)] +pub struct Environment { + values: HashMap, +} + +impl Environment { + /// Define a new variable. + pub fn define(&mut self, name: String, value: Value) { + self.values.insert(name, value); + } + + /// Get the value of a variable. + pub fn get(&self, name: &Token) -> Result { + match self.values.get(&name.lexeme as &str) { + None => Err(InterpreterError::new( + name, + &format!("undefined variable '{}'", name.lexeme), + )), + Some(value) => Ok(value.clone()), + } + } +}