aboutsummaryrefslogtreecommitdiff
path: root/rust/src/reader.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/src/reader.rs')
-rw-r--r--rust/src/reader.rs46
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();