///|
/// Pattern printing functions  
fn print_func(func : @syntax.Func, logger : StringBuilder) -> Unit {
  match func {
    Lambda(parameters~, body~, return_type~, error_type~, kind~, ..) => {
      match kind {
        Lambda => logger.write_string("fn")
        Matrix => logger.write_string("fn")
        Arrow => logger.write_string("fn")
      }
      logger.write_string("(")
      print_list(parameters, print_parameter, ", ", logger)
      logger.write_string(")")
      match return_type {
        Some(ret_ty) => {
          logger.write_string(" -> ")
          print_type(ret_ty, logger)
        }
        None => ()
      }
      print_error_type(error_type, logger)
      logger.write_string(" { ")
      print_expr(body, logger)
      logger.write_string(" }")
    }
    Match(cases~, ..) => {
      logger.write_string("fn { ")
      for case in cases {
        print_list(case.patterns, print_pattern, ", ", logger)
        match case.guard_ {
          Some(guard_expr) => {
            logger.write_string(" if ")
            print_expr(guard_expr, logger)
          }
          None => ()
        }
        logger.write_string(" => ")
        print_expr(case.body, logger)
        logger.write_string("; ")
      }
      logger.write_string("}")
    }
  }
}