diff --git a/src/cell.rs b/src/cell.rs index 68d2ef6..b862113 100644 --- a/src/cell.rs +++ b/src/cell.rs @@ -59,6 +59,7 @@ pub fn cons (l_ctr: Ctr, r_ctr: Ctr) -> Cell { */ pub fn cell_as_string(c: &Cell, with_parens: bool) -> String { let mut string = String::new(); + let mut prn_space = true; match &c.car { Ctr::SYMBOL(s) => string.push_str(&s), Ctr::STRING(s) => { @@ -70,10 +71,13 @@ pub fn cell_as_string(c: &Cell, with_parens: bool) -> String { Ctr::FLOAT(f) => string = string + &f.to_string(), Ctr::BOOL(b) => string = string + &b.to_string(), Ctr::CELL(c) => string.push_str(cell_as_string(&c, true).as_str()), - Ctr::None => string.push_str("nil") + Ctr::None => prn_space = false + } + + if prn_space { + string.push(' '); } - string.push(' '); match &c.cdr { Ctr::SYMBOL(s) => string.push_str(&s), Ctr::STRING(s) => { @@ -85,7 +89,11 @@ pub fn cell_as_string(c: &Cell, with_parens: bool) -> String { Ctr::FLOAT(f) => string = string + &f.to_string(), Ctr::BOOL(b) => string = string + &b.to_string(), Ctr::CELL(c) => string.push_str(cell_as_string(&c, false).as_str()), - Ctr::None => string.push_str("nil") + Ctr::None => { + if prn_space { + string.pop(); + } + } } // TODO: maybe a better way to do this diff --git a/src/lex.rs b/src/lex.rs index ccf00c0..d26b350 100644 --- a/src/lex.rs +++ b/src/lex.rs @@ -85,6 +85,7 @@ fn process(document: String) -> Result, String> { needs_alloc = true; // reset comment line status if delim == '\n' { + delim_stack.pop(); ign = false; continue; } diff --git a/tests/test_lex.rs b/tests/test_lex.rs index fc3e8fa..f7e9f1d 100644 --- a/tests/test_lex.rs +++ b/tests/test_lex.rs @@ -4,10 +4,9 @@ mod lex_tests { #[test] fn test_lex_basic_pair() { let document: &str = "(hello 'world')"; - let output: &str = "(hello 'world' nil)"; match lex(document.to_string()) { Ok(box_cell) => { - assert_eq!(format!("{}", *box_cell), output.to_string()); + assert_eq!(format!("{}", *box_cell), document); }, Err(s) => { print!("{}\n", s); @@ -19,10 +18,9 @@ mod lex_tests { #[test] fn test_lex_basic_list() { let document: &str = "(hello 'world' 1 2 3)"; - let output: &str = "(hello 'world' 1 2 3 nil)"; match lex(document.to_string()) { Ok(box_cell) => { - assert_eq!(format!("{}", *box_cell), output.to_string()); + assert_eq!(format!("{}", *box_cell), document); }, Err(s) => { print!("{}\n", s); @@ -34,10 +32,9 @@ mod lex_tests { #[test] fn test_lex_complex_list() { let document: &str = "(hello 'world' (1 2 (1 2 3)) 1 2 3)"; - let output: &str = "(hello 'world' (1 2 (1 2 3 nil) nil) 1 2 3 nil)"; match lex(document.to_string()) { Ok(box_cell) => { - assert_eq!(format!("{}", *box_cell), output.to_string()); + assert_eq!(format!("{}", *box_cell), document); }, Err(s) => { print!("{}\n", s); @@ -94,7 +91,7 @@ mod lex_tests { #[test] fn test_comment() { let document: &str = "#!/bin/relish\n(one two)"; - let output: &str = "(one two nil)"; + let output: &str = "(one two)"; match lex(document.to_string()) { Ok(box_cell) => { assert_eq!(format!("{}", *box_cell), output.to_string()); @@ -109,7 +106,7 @@ mod lex_tests { #[test] fn test_postline_comment() { let document: &str = "#!/bin/relish\n((one two)# another doc comment\n(three four))"; - let output: &str = "(one two nil)"; + let output: &str = "((one two) (three four))"; match lex(document.to_string()) { Ok(box_cell) => { assert_eq!(format!("{}", *box_cell), output.to_string()); @@ -124,7 +121,7 @@ mod lex_tests { #[test] fn test_inline_comment() { let document: &str = "#!/bin/relish\n((one two)\n# another doc comment\nthree)"; - let output: &str = "(one two nil)"; + let output: &str = "((one two) three)"; match lex(document.to_string()) { Ok(box_cell) => { assert_eq!(format!("{}", *box_cell), output.to_string());