From 8038a673a628490e20275a16c3ca036c2d3babf6 Mon Sep 17 00:00:00 2001 From: bnewbold Date: Wed, 20 Apr 2016 17:35:44 -0400 Subject: rust: add SchemeProcedure enum type --- minimal.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/minimal.rs b/minimal.rs index 4990d15..55c67dc 100644 --- a/minimal.rs +++ b/minimal.rs @@ -23,6 +23,10 @@ enum SchemeExpr<'a> { SchemeBuiltin(&'a str), SchemeSymbol(&'a str), SchemeStr(&'a str), + SchemeProcedure( + Vec>, + Vec>, + HashMap<&'a str, SchemeExpr<'a>>), SchemeList(Vec>), SchemeQuote(Vec>), } @@ -166,10 +170,22 @@ fn scheme_repr<'a>(ast: &SchemeExpr) -> Result { &SchemeExpr::SchemeTrue => Ok("#t".to_string()), &SchemeExpr::SchemeFalse => Ok("#f".to_string()), &SchemeExpr::SchemeNull => Ok("'()".to_string()), + &SchemeExpr::SchemeNum(num) => Ok(format!("{}", num).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::SchemeProcedure(ref binds, ref body, _) => { + let mut ret = "(lambda (".to_string(); + for bind in binds { + ret = ret + &try!(scheme_repr(&bind)) + " "; + } + ret = ret + ") "; + for expr in body { + ret = ret + &try!(scheme_repr(&expr)); + } + ret = ret + ")"; + Ok(ret) + }, &SchemeExpr::SchemeList(ref list) => { let mut ret: String = list.iter().fold("(".to_string(), @@ -229,9 +245,10 @@ fn scheme_meaning<'a>(ast: &'a SchemeExpr, ctx: HashMap<&str, SchemeExpr<'a>>) - &SchemeExpr::SchemeTrue => Ok(ast.clone()), &SchemeExpr::SchemeFalse => Ok(ast.clone()), &SchemeExpr::SchemeNull => Ok(ast.clone()), - &SchemeExpr::SchemeStr(s) => Ok(ast.clone()), - &SchemeExpr::SchemeNum(num) => Ok(ast.clone()), - &SchemeExpr::SchemeBuiltin(b) => Ok(ast.clone()), + &SchemeExpr::SchemeStr(_) => Ok(ast.clone()), + &SchemeExpr::SchemeNum(_) => Ok(ast.clone()), + &SchemeExpr::SchemeBuiltin(_) => Ok(ast.clone()), + &SchemeExpr::SchemeProcedure(_, _, _) => Ok(ast.clone()), &SchemeExpr::SchemeQuote(ref list) => Ok(SchemeExpr::SchemeList(list.clone())), &SchemeExpr::SchemeSymbol(sym) => match ctx.get(sym) { -- cgit v1.2.3