| 
					
				 | 
			
			
				@@ -30,12 +30,16 @@ impl ASTArena { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     pub fn show_stmt(&self, stmt: &Stmt, f: &mut fmt::Formatter) -> fmt::Result { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         match stmt { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Stmt::Puts(expr) => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                writeln!(f, "{:?}", expr), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Stmt::Puts(expr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                write!(f, "Puts ")?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.show_expr(&expr, f, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Stmt::Fix(name) => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 writeln!(f, "Fix({})", &self[*name]), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Stmt::Assn(name, expr) => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                writeln!(f, "Assn(\n  {},\n  {:?}\n)", &self[*name], expr), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Stmt::Assn(name, expr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                write!(f, "Assn {} ", &self[*name])?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.show_expr(&expr, f, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Stmt::LitAssn(name, strs) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 write!(f, "LitAssn({}, [ ", &self[*name])?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 for str in strs.iter() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -45,6 +49,78 @@ impl ASTArena { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn indent(&self, f: &mut fmt::Formatter, depth: usize) -> fmt::Result { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for _ in 0..depth { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            write!(f, " ")?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Ok(()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fn show_expr(&self, expr: &Expr, f: &mut fmt::Formatter, depth: usize) -> fmt::Result { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        match expr { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Expr::Var(v) => writeln!(f, "Var({})", &self[*v]), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Expr::Lit(Literal::Atom(n)) => writeln!(f, "Lit(Atom({}))", &self[*n]), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Expr::Lit(lit) => writeln!(f, "{:?}", lit), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Expr::Range(from, to) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, "Range(")?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.indent(f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.show_expr(from, f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.indent(f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.show_expr(to, f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.indent(f, depth)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, ")") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Expr::Ap(func, arg) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, "Ap(")?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.indent(f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.show_expr(func, f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.indent(f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.show_expr(arg, f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.indent(f, depth)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, ")") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Expr::Tup(expr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, "Tup(")?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for e in expr { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    self.indent(f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    self.show_expr(e, f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.indent(f, depth)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, ")") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Expr::Cat(expr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, "Cat(")?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for e in expr { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    self.indent(f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    self.show_expr(e, f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.indent(f, depth)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, ")") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Expr::Chc(expr) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, "Chc(")?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for e in expr { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if let Some(s) = e.weight { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        self.indent(f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        writeln!(f, "{}:", s)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        self.indent(f, depth + 4)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        self.show_expr(&e.value, f, depth + 4)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        self.indent(f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        self.show_expr(&e.value, f, depth + 2)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                self.indent(f, depth)?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                writeln!(f, ")") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _ => writeln!(f, "[???]"), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 impl std::ops::Index<string_interner::DefaultSymbol> for ASTArena { 
			 |