From 15b331f4470a09955a65eeb1cc5eadb0b3e300b4 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Tue, 11 Feb 2025 14:09:52 +0100 Subject: [PATCH] pull interpreter value out into its own file --- rust/rox/src/interpreter.rs | 30 +------------------------ rust/rox/src/lib.rs | 3 ++- rust/rox/src/value.rs | 45 +++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 rust/rox/src/value.rs diff --git a/rust/rox/src/interpreter.rs b/rust/rox/src/interpreter.rs index 85f151f..f55ed54 100644 --- a/rust/rox/src/interpreter.rs +++ b/rust/rox/src/interpreter.rs @@ -3,6 +3,7 @@ use thiserror::Error; use crate::{ expression::Expression, token::{Literal, Token, TokenType}, + value::Value, }; #[derive(Error, Debug)] @@ -15,35 +16,6 @@ pub enum InterpreterError { BinaryOperatorUnknown(usize, String), } -#[derive(Clone, Debug, PartialEq)] -pub enum Value { - String(String), - Number(f64), - Boolean(bool), - Nil, -} - -impl Value { - fn is_truthy(&self) -> bool { - match self { - Value::Nil => false, - Value::Boolean(b) => *b, - _ => true, - } - } -} - -impl From for Value { - fn from(value: Literal) -> Self { - match value { - Literal::String(x) => Value::String(x), - Literal::Number(x) => Value::Number(x), - Literal::Boolean(x) => Value::Boolean(x), - Literal::Nil => Value::Nil, - } - } -} - /// Try to evaluate an expression and return its result. pub fn evaluate(expression: Expression) -> Result { match expression { diff --git a/rust/rox/src/lib.rs b/rust/rox/src/lib.rs index d185fb0..64b32bb 100644 --- a/rust/rox/src/lib.rs +++ b/rust/rox/src/lib.rs @@ -27,6 +27,7 @@ pub mod tokenizer { pub mod string; pub mod whitespace; } +pub mod value; /// Read the source code in a file and scan it to tokens. pub fn compile(source: &Path) -> Result<(), io::Error> { @@ -57,7 +58,7 @@ fn run(input: &str) { let tokens = scanner::tokenize(input); match parser::generate_ast(tokens) { Ok(ast) => match interpreter::evaluate(ast) { - Ok(value) => info!("{value:?}"), + Ok(value) => println!("{value}"), Err(e) => error!("{e}"), }, Err(e) => error!("{e}"), diff --git a/rust/rox/src/value.rs b/rust/rox/src/value.rs new file mode 100644 index 0000000..5efcc64 --- /dev/null +++ b/rust/rox/src/value.rs @@ -0,0 +1,45 @@ +use std::fmt::Display; + +use crate::token::Literal; + +/// Concrete value in the interpreter. +#[derive(Clone, Debug, PartialEq)] +pub enum Value { + String(String), + Number(f64), + Boolean(bool), + Nil, +} + +impl Display for Value { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Value::String(x) => write!(f, "{x}"), + Value::Number(x) => write!(f, "{x}"), + Value::Boolean(x) => write!(f, "{x}"), + Value::Nil => write!(f, "nil"), + } + } +} + +impl Value { + /// Return false for nil or a false boolean, true otherwise. + pub fn is_truthy(&self) -> bool { + match self { + Value::Nil => false, + Value::Boolean(b) => *b, + _ => true, + } + } +} + +impl From for Value { + fn from(value: Literal) -> Self { + match value { + Literal::String(x) => Value::String(x), + Literal::Number(x) => Value::Number(x), + Literal::Boolean(x) => Value::Boolean(x), + Literal::Nil => Value::Nil, + } + } +}