diff options
author | bnewbold <bnewbold@robocracy.org> | 2016-04-20 01:05:03 -0400 |
---|---|---|
committer | bnewbold <bnewbold@robocracy.org> | 2016-04-20 01:05:03 -0400 |
commit | aabe6b810f04f75546024cd5ac5ec1c1cc7b2f8b (patch) | |
tree | cf5bd2b0d3ffb6284d9dd6dfbd68a64547c4581e | |
parent | 35137a03a8a011bc6b7681916e3de05639b32423 (diff) | |
download | spectrum-aabe6b810f04f75546024cd5ac5ec1c1cc7b2f8b.tar.gz spectrum-aabe6b810f04f75546024cd5ac5ec1c1cc7b2f8b.zip |
rust: add symbol and quote types
-rw-r--r-- | minimal.rs | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -21,8 +21,10 @@ enum SchemeExpr<'a> { SchemeFalse, SchemeNum(f64), SchemeBuiltin(&'a str), + SchemeSymbol(&'a str), SchemeStr(&'a str), SchemeList(Vec<SchemeExpr<'a>>), + SchemeQuote(Vec<SchemeExpr<'a>>), } /////////////////////////////////// @@ -106,6 +108,11 @@ fn scheme_parse_token(token: &str) -> Result<SchemeExpr, &'static str> { return Ok(SchemeExpr::SchemeStr(token)); } + // If it's all alphas, must be a symbol + if token.is_alpha() { + return Ok(SchemeExpr::SchemeSymbol(token)); + } + return Err("unparsable token"); } @@ -154,6 +161,7 @@ fn scheme_repr<'a>(ast: &SchemeExpr) -> Result<String, &'static str> { &SchemeExpr::SchemeNull => Ok("'()".to_string()), &SchemeExpr::SchemeBuiltin(b)=> Ok(b.to_string()), &SchemeExpr::SchemeStr(s)=> Ok(s.to_string()), + &SchemeExpr::SchemeSymbol(s)=> Ok(s.to_string()), &SchemeExpr::SchemeNum(num) => Ok(format!("{}", num).to_string()), &SchemeExpr::SchemeList(ref list) => { let mut ret: String = @@ -162,6 +170,13 @@ fn scheme_repr<'a>(ast: &SchemeExpr) -> Result<String, &'static str> { ret.push_str(" )"); Ok(ret) }, + &SchemeExpr::SchemeQuote(ref list) => { + let mut ret: String = + list.iter().fold("(quote ".to_string(), + |acc, ref el| acc + " " + &scheme_repr(&el).unwrap()); + ret.push_str(" )"); + Ok(ret) + }, } } |