diff options
| author | Joel Martin <github@martintribe.org> | 2015-03-05 13:07:30 -0600 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2015-03-05 13:07:30 -0600 |
| commit | 35012ea4d59764ab3744f56b5fb5684e86e80422 (patch) | |
| tree | b27e98a23acf56242cf393aa6ea0cdf7815b7d38 /rust/src/reader.rs | |
| parent | 758933f21515b282423bfcb0a2d5a7eca9b41b20 (diff) | |
| parent | e1b2062f95505729e5188d4c857003877e2c09b4 (diff) | |
| download | mal-35012ea4d59764ab3744f56b5fb5684e86e80422.tar.gz mal-35012ea4d59764ab3744f56b5fb5684e86e80422.zip | |
Merge pull request #26 from alexcrichton/update
Update Rust code to the current Rust nightly
Diffstat (limited to 'rust/src/reader.rs')
| -rw-r--r-- | rust/src/reader.rs | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/rust/src/reader.rs b/rust/src/reader.rs index d7b2b4c..4750c46 100644 --- a/rust/src/reader.rs +++ b/rust/src/reader.rs @@ -1,20 +1,14 @@ -//#![feature(phase)] -//#[phase(plugin)] -//extern crate regex_macros; -//extern crate regex; - -extern crate pcre; - -use types::{MalVal,MalRet,ErrString,ErrMalVal, - _nil,_true,_false,_int,symbol,string,list,vector,hash_mapv, - err_str,err_string,err_val}; -use self::pcre::Pcre; +use types::MalError::{ErrString, ErrMalVal}; +use types::{MalVal, MalRet, + _nil, _true, _false, _int, symbol, string, list, vector, hash_mapv, + err_str, err_string, err_val}; +use pcre::Pcre; use super::printer::unescape_str; -#[deriving(Show, Clone)] +#[derive(Debug, Clone)] struct Reader { - tokens : Vec<String>, - position : uint, + tokens: Vec<String>, + position: usize, } impl Reader { @@ -35,15 +29,15 @@ impl Reader { } } -fn tokenize(str :String) -> Vec<String> { +fn tokenize(str: String) -> Vec<String> { let mut results = vec![]; let re = match Pcre::compile(r###"[\s,]*(~@|[\[\]{}()'`~^@]|"(?:\\.|[^\\"])*"|;.*|[^\s\[\]{}('"`,;)]*)"###) { - Err(_) => { fail!("failed to compile regex") }, + Err(_) => { panic!("failed to compile regex") }, Ok(re) => re }; - let mut it = re.matches(str.as_slice()); + let mut it = re.matches(&str); loop { let opt_m = it.next(); if opt_m.is_none() { break; } @@ -61,15 +55,15 @@ fn read_atom(rdr : &mut Reader) -> MalRet { //println!("read_atom: {}", otoken); if otoken.is_none() { return err_str("read_atom underflow"); } let stoken = otoken.unwrap(); - let token = stoken.as_slice(); + let token = &stoken[..]; if regex!(r"^-?[0-9]+$").is_match(token) { - let num : Option<int> = from_str(token); + let num : Option<isize> = token.parse().ok(); Ok(_int(num.unwrap())) } else if regex!(r#"^".*"$"#).is_match(token) { - let new_str = token.slice(1,token.len()-1); + let new_str = &token[1..token.len()-1]; Ok(string(unescape_str(new_str))) } else if regex!(r#"^:"#).is_match(token) { - Ok(string("\u029e".to_string() + token.slice(1,token.len()))) + Ok(string(format!("\u{29e}{}", &token[1..]))) } else if token == "nil" { Ok(_nil()) } else if token == "true" { @@ -87,19 +81,19 @@ fn read_seq(rdr : &mut Reader, start: &str, end: &str) -> Result<Vec<MalVal>,Str return Err("read_atom underflow".to_string()); } let stoken = otoken.unwrap(); - let token = stoken.as_slice(); + let token = &stoken[..]; if token != start { - return Err("expected '".to_string() + start.to_string() + "'".to_string()); + return Err(format!("expected '{}'", start)) } let mut ast_vec : Vec<MalVal> = vec![]; loop { let otoken = rdr.peek(); if otoken.is_none() { - return Err("expected '".to_string() + end.to_string() + "', got EOF".to_string()); + return Err(format!("expected '{}', got EOF", end)); } let stoken = otoken.unwrap(); - let token = stoken.as_slice(); + let token = &stoken[..]; if token == end { break; } match read_form(rdr) { @@ -138,7 +132,7 @@ fn read_form(rdr : &mut Reader) -> MalRet { let otoken = rdr.peek(); //println!("read_form: {}", otoken); let stoken = otoken.unwrap(); - let token = stoken.as_slice(); + let token = &stoken[..]; match token { "'" => { let _ = rdr.next(); |
