From 240aca36313016df68f03954c54c2bc21910344e Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 24 Mar 2021 18:16:52 +0530 Subject: rename env to eval, add div operator --- src/lisp/number.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'src/lisp/number.rs') diff --git a/src/lisp/number.rs b/src/lisp/number.rs index ddadbe6..18a41f7 100644 --- a/src/lisp/number.rs +++ b/src/lisp/number.rs @@ -1,14 +1,32 @@ use std::{ - fmt::*, + fmt, ops::{Add, Div, Mul, Sub}, }; +use crate::lisp::error::LispError; + #[derive(Debug, Copy, Clone)] pub enum LispNumber { Integer(i64), Float(f64), } +impl LispNumber { + pub fn div(self, rhs: Self) -> Result { + use LispNumber::*; + if rhs == Integer(0) || rhs == Float(0.) { + return Err(LispError::EvalError); + } else { + return Ok(match (self, rhs) { + (Integer(a), Integer(b)) => Float(a as f64 / b as f64), + (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 Add for LispNumber { type Output = Self; fn add(self, rhs: Self) -> Self::Output { @@ -60,8 +78,8 @@ impl PartialEq for LispNumber { } } -impl Display for LispNumber { - fn fmt(&self, f: &mut Formatter<'_>) -> Result { +impl fmt::Display for LispNumber { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { LispNumber::Integer(v) => write!(f, "{}", v), LispNumber::Float(v) => write!(f, "{}", v), -- cgit v1.2.3