aboutsummaryrefslogtreecommitdiffstats
path: root/src/transpile_scheme.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/transpile_scheme.rs')
-rw-r--r--src/transpile_scheme.rs55
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()))),
+ }
+ }
+}