From ae79d5a8b0166d43d3ff48aa593db6038b40410b Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 19 Mar 2021 21:57:34 +0530 Subject: begin work on scripting lisp --- src/lisp/number.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/lisp/number.rs (limited to 'src/lisp/number.rs') diff --git a/src/lisp/number.rs b/src/lisp/number.rs new file mode 100644 index 0000000..ddadbe6 --- /dev/null +++ b/src/lisp/number.rs @@ -0,0 +1,70 @@ +use std::{ + fmt::*, + ops::{Add, Div, Mul, Sub}, +}; + +#[derive(Debug, Copy, Clone)] +pub enum LispNumber { + Integer(i64), + Float(f64), +} + +impl Add for LispNumber { + type Output = Self; + fn add(self, rhs: Self) -> Self::Output { + use LispNumber::*; + match (self, rhs) { + (Integer(a), Integer(b)) => Integer(a + b), + (Float(a), Integer(b)) => Float(a + b as f64), + (Integer(a), Float(b)) => Float(a as f64 + b), + (Float(a), Float(b)) => Float(a + b), + } + } +} + +impl Sub for LispNumber { + type Output = Self; + fn sub(self, rhs: Self) -> Self::Output { + use LispNumber::*; + match (self, rhs) { + (Integer(a), Integer(b)) => Integer(a - b), + (Float(a), Integer(b)) => Float(a - b as f64), + (Integer(a), Float(b)) => Float(a as f64 - b), + (Float(a), Float(b)) => Float(a - b), + } + } +} + +impl Mul for LispNumber { + type Output = Self; + fn mul(self, rhs: Self) -> Self::Output { + use LispNumber::*; + match (self, rhs) { + (Integer(a), Integer(b)) => Integer(a * b), + (Float(a), Integer(b)) => Float(a * b as f64), + (Integer(a), Float(b)) => Float(a as f64 * b), + (Float(a), Float(b)) => Float(a * b), + } + } +} + +impl PartialEq for LispNumber { + fn eq(&self, other: &Self) -> bool { + use LispNumber::*; + match (self, other) { + (Integer(a), Integer(b)) => *a == *b, + (Float(a), Integer(b)) => *a == *b as f64, + (Integer(a), Float(b)) => *a as f64 == *b, + (Float(a), Float(b)) => *a == *b, + } + } +} + +impl Display for LispNumber { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + match self { + LispNumber::Integer(v) => write!(f, "{}", v), + LispNumber::Float(v) => write!(f, "{}", v), + } + } +} -- cgit v1.2.3