diff options
author | bnewbold <bnewbold@robocracy.org> | 2016-11-02 19:06:23 -0700 |
---|---|---|
committer | bnewbold <bnewbold@robocracy.org> | 2016-11-02 19:06:23 -0700 |
commit | ece67d35847ec89cbf4d3d13236ce5bb1d51b716 (patch) | |
tree | 9bb1e7eedb1792a652648d0319bb417935b267a4 /src/transpile_scheme.rs | |
parent | a0ade9fdd10ed246bc228f74662ef2264d67f4e3 (diff) | |
download | modelthing-ece67d35847ec89cbf4d3d13236ce5bb1d51b716.tar.gz modelthing-ece67d35847ec89cbf4d3d13236ce5bb1d51b716.zip |
skeletal scheme transpilation
Diffstat (limited to 'src/transpile_scheme.rs')
-rw-r--r-- | src/transpile_scheme.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/transpile_scheme.rs b/src/transpile_scheme.rs new file mode 100644 index 0000000..ce66d10 --- /dev/null +++ b/src/transpile_scheme.rs @@ -0,0 +1,55 @@ + +use modelica_ast::*; + +pub trait TranspileScheme { + fn repr_scheme(&self) -> Result<String, String>; +} + + +impl TranspileScheme for ModelicaModel { + fn repr_scheme(&self) -> Result<String, String> { + let mut constants = vec![]; + for (c, e) in self.get_constant_vars() { + constants.push(format!("({} {})", + c, try!(e.repr_scheme()))); + } + let mut binds = vec![]; + let mut outputs = vec![]; + for eq in self.equations.iter() { + if let Expr::Ident(ref symb) = eq.lhs { + binds.push(format!("({} {})", + symb, + try!(eq.rhs.repr_scheme()))); + outputs.push(symb.to_string()); + } else { + return Err("Expected an identifier on LHS (in this partial implementation)".to_string()) + } + } + Ok(format!(r#"(lambda ({args}) + (let ({constants}) + (letrec ({binds}) + (list {outputs}))))"#, + args = self.get_free_vars().join(" "), + constants = constants.join("\n "), + binds = binds.join("\n "), + outputs = outputs.join(" "))) + } +} + +impl TranspileScheme for Expr { + fn repr_scheme(&self) -> Result<String, String> { + use modelica_ast::Expr::*; + match *self { + Integer(e) => Ok(format!("{}", e)), + Float(e) => Ok(format!("{}", e)), + Ident(ref e) => Ok(format!("{}", e)), + Der(ref e) => Ok(format!("(der {})", try!(e.repr_scheme()))), + Abs(ref e) => Ok(format!("(abs {})", try!(e.repr_scheme()))), + BinExpr(op, ref l, ref r) => + Ok(format!("({:?} {} {})", + op, + try!(l.repr_scheme()), + try!(r.repr_scheme()))), + } + } +} |