From ae3399a826dad61afe89907ec602df3d1ac916be Mon Sep 17 00:00:00 2001 From: ada Date: Thu, 22 Oct 2020 20:22:40 +0200 Subject: [PATCH] prototyping lisp v0 --- lisp/lisp.rs | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/lisp/lisp.rs b/lisp/lisp.rs index 197bfe4aa..b8df722a1 100644 --- a/lisp/lisp.rs +++ b/lisp/lisp.rs @@ -111,6 +111,30 @@ impl InPort { } } +// TODO change return type to Symbol +fn read(inport: InPort) -> String { + fn read_ahead(token: String) { + match token { + "(" => { + let L = Vec::new(); + loop { + let token = inport.next_token(); + if token == ")" { + return L; + } else { + L.append(read_ahead(token)); + } + } + }, + _ => { println!("{}", token); } + } + } + let token1 = inport.next_token(); + if token1 == "#".to_string() { + return "#".to_string(); + } +} + fn parse_atom(token: &str) -> RispExp { match token.as_ref() { "true" => RispExp::Bool(true), @@ -383,15 +407,7 @@ fn main() { let env = &mut default_env(); let mut reader = InPort::init("new.lisp".to_string()); let mut token = String::new(); - loop { - if token == "#".to_string() { - println!("EOF"); - break; - } - - token = reader.next_token().as_str().to_string(); - println!("{}", token); - } + read(reader); // read from file // let file = File::open("new.lisp").unwrap(); // let lines = io::BufReader::new(file).lines();