diff --git a/src/main.rs b/src/main.rs index e304e31..83b8006 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ pub mod collections; fn main() { - let input = String::from("(println \">>>>>\" (+ 2 3))"); + let input = String::from("(println \">>>>>\" '(+ 2 -3))"); println!("{:?}", reader::read_string(&input).unwrap()); diff --git a/src/reader.rs b/src/reader.rs index ea40248..95f3893 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -185,8 +185,14 @@ impl ExprReader { } fn read_number(&mut self, reader: &mut BufReader, neg: bool) -> ReadResult { + let mut is_double = false; - let mut string = "".to_string(); + let mut string = (if neg { + "-" + } else { + "" + }).to_string(); + loop { match self.get_char(reader, false) { Some(e) if e == '.' && is_double => return Err("A double with more that one '.' ???".to_string()), @@ -216,7 +222,23 @@ impl ExprReader { c if c.is_digit(10) => self.read_number(reader, false), // ':' => self.read_keyword(reader), - // '-' => { + '-' => { + // Read the '-' char + let _ = self.get_char(reader, true); + match self.peek_char(reader, true) { + Some(ch) => match ch { + ch if ch.is_digit(10) => self.read_number(reader, true), + _ => { + self.unget_char(c); + self._read_symbol(reader) + } + }, + None => { + self.unget_char(c); + self._read_symbol(reader) + } + } + } // Neg number // } _ => self._read_symbol(reader)