From ed748cbd702c1988cb85d9684fc2c43ae8ad8c56 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Sun, 1 May 2022 10:47:20 +1000 Subject: [PATCH] vs_value --- src/vstc/main.rs | 1 + src/vstc/vs_value.rs | 97 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/vstc/vs_value.rs diff --git a/src/vstc/main.rs b/src/vstc/main.rs index 86eeb67..fcfbd38 100644 --- a/src/vstc/main.rs +++ b/src/vstc/main.rs @@ -1,6 +1,7 @@ mod assemble; mod run; mod virtual_machine; +mod vs_value; use std::env; use std::process::exit; diff --git a/src/vstc/vs_value.rs b/src/vstc/vs_value.rs new file mode 100644 index 0000000..4866334 --- /dev/null +++ b/src/vstc/vs_value.rs @@ -0,0 +1,97 @@ +use std::rc::Rc; + +type Val = Rc; + +#[derive(PartialEq)] +enum VsType { + Undefined, + Null, + Bool, + Number, + String, + Array, + Object, + Function, +} + +impl VsType { + fn as_val(&self) -> Val { + return VsString::from_str(match self { + Undefined => "undefined", + Null => "object", + Bool => "boolean", + Number => "number", + String => "string", + Array => "object", + Object => "object", + Function => "function", + }); + } +} + +trait VsValue { + fn typeof_(&self) -> VsType; + fn to_string(&self) -> String; + fn to_number(&self) -> f64; +} + +pub struct VsNumber { + value: f64, +} + +impl VsNumber { + fn from_f64(value: f64) -> Val { + return Rc::new(VsNumber { value: value }); + } +} + +pub struct VsString { + value: String, +} + +impl VsString { + fn from_str(value: &str) -> Val { + return Rc::new(VsString { value: value.to_string() }); + } + + fn from_string(value: String) -> Val { + return Rc::new(VsString { value: value }); + } +} + +impl VsValue for VsNumber { + fn typeof_(&self) -> VsType { + return VsType::Number; + } + + fn to_string(&self) -> String { + return self.value.to_string(); + } + + fn to_number(&self) -> f64 { + return self.value; + } +} + +impl VsValue for VsString { + fn typeof_(&self) -> VsType { + return VsType::String; + } + + fn to_string(&self) -> String { + return self.value.clone(); + } + + fn to_number(&self) -> f64 { + std::panic!("not implemented"); + } +} + +fn add(left: &Rc, right: &Rc) -> Rc { + if left.typeof_() == VsType::String || right.typeof_() == VsType::String { + // TODO: Do we need .clone() on the left here? If not, why? + return VsString::from_string(left.to_string() + &right.to_string()); + } + + return VsNumber::from_f64(left.to_number() + right.to_number()); +}