oxilean_codegen/haskell_backend/
haskellexpr_traits.rs1use crate::lcnf::*;
12
13use super::types::{HaskellDoStmt, HaskellExpr, HsListQual};
14use std::fmt;
15
16impl fmt::Display for HaskellExpr {
17 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18 match self {
19 HaskellExpr::Lit(lit) => write!(f, "{}", lit),
20 HaskellExpr::Var(v) => write!(f, "{}", v),
21 HaskellExpr::App(func, args) => {
22 write!(f, "({}", func)?;
23 for a in args {
24 write!(f, " {}", a)?;
25 }
26 write!(f, ")")
27 }
28 HaskellExpr::Lambda(pats, body) => {
29 write!(f, "(\\")?;
30 for (i, p) in pats.iter().enumerate() {
31 if i > 0 {
32 write!(f, " ")?;
33 }
34 write!(f, "{}", p)?;
35 }
36 write!(f, " -> {})", body)
37 }
38 HaskellExpr::Let(name, val, body) => {
39 write!(f, "(let {} = {} in {})", name, val, body)
40 }
41 HaskellExpr::Where(expr, _defs) => write!(f, "{}", expr),
42 HaskellExpr::If(cond, then_e, else_e) => {
43 write!(f, "(if {} then {} else {})", cond, then_e, else_e)
44 }
45 HaskellExpr::Case(scrut, alts) => {
46 write!(f, "(case {} of {{ ", scrut)?;
47 for (i, alt) in alts.iter().enumerate() {
48 if i > 0 {
49 write!(f, "; ")?;
50 }
51 write!(f, "{}", alt.pattern)?;
52 if let Some(body) = &alt.body {
53 write!(f, " -> {}", body)?;
54 }
55 }
56 write!(f, " }})")
57 }
58 HaskellExpr::Do(stmts) => {
59 write!(f, "do {{ ")?;
60 for (i, stmt) in stmts.iter().enumerate() {
61 if i > 0 {
62 write!(f, "; ")?;
63 }
64 match stmt {
65 HaskellDoStmt::Bind(name, expr) => write!(f, "{} <- {}", name, expr)?,
66 HaskellDoStmt::Stmt(expr) => write!(f, "{}", expr)?,
67 HaskellDoStmt::LetBind(name, expr) => write!(f, "let {} = {}", name, expr)?,
68 }
69 }
70 write!(f, " }}")
71 }
72 HaskellExpr::ListComp(body, quals) => {
73 write!(f, "[ {} | ", body)?;
74 for (i, q) in quals.iter().enumerate() {
75 if i > 0 {
76 write!(f, ", ")?;
77 }
78 match q {
79 HsListQual::Generator(v, e) => write!(f, "{} <- {}", v, e)?,
80 HsListQual::Guard(e) => write!(f, "{}", e)?,
81 HsListQual::LetBind(v, e) => write!(f, "let {} = {}", v, e)?,
82 }
83 }
84 write!(f, " ]")
85 }
86 HaskellExpr::Tuple(elems) => {
87 write!(f, "(")?;
88 for (i, e) in elems.iter().enumerate() {
89 if i > 0 {
90 write!(f, ", ")?;
91 }
92 write!(f, "{}", e)?;
93 }
94 write!(f, ")")
95 }
96 HaskellExpr::List(elems) => {
97 write!(f, "[")?;
98 for (i, e) in elems.iter().enumerate() {
99 if i > 0 {
100 write!(f, ", ")?;
101 }
102 write!(f, "{}", e)?;
103 }
104 write!(f, "]")
105 }
106 HaskellExpr::Neg(e) => write!(f, "(negate {})", e),
107 HaskellExpr::InfixApp(lhs, op, rhs) => write!(f, "({} {} {})", lhs, op, rhs),
108 HaskellExpr::Operator(op) => write!(f, "({})", op),
109 HaskellExpr::TypeAnnotation(expr, ty) => write!(f, "({} :: {})", expr, ty),
110 }
111 }
112}