anchor.diff:    | VarAs of name : string * expr : string * as_type : string
     | CheckNull of var_name : string
     | CustomCheck of condition : string
  -  | Iterate of var_name : string * tmp_var_name : string * expr:BasicExpression<Keyword, Var, Literal, Position, TypeInference.TypeAnnotation> * path : Path
  -  | Compare of comparison : Keyword * expr1:BasicExpression<Keyword, Var, Literal, Position, TypeInference.TypeAnnotation> * expr2:BasicExpression<Keyword, Var, Literal, Position, TypeInference.TypeAnnotation>
  -  | Inline of e:BasicExpression<Keyword, Var, Literal, Position, TypeInference.TypeAnnotation>
  -  | Yield of expr:BasicExpression<Keyword, Var, Literal, Position, TypeInference.TypeAnnotation>
  +  | Iterate of var_name : string * tmp_var_name : string * expr:BasicExpression<Keyword, Var, Literal, Position, TypeInference.Type> * path : Path
  +  | Compare of comparison : Keyword * expr1:BasicExpression<Keyword, Var, Literal, Position, TypeInference.Type> * expr2:BasicExpression<Keyword, Var, Literal, Position, TypeInference.Type>
  +  | Inline of e:BasicExpression<Keyword, Var, Literal, Position, TypeInference.Type>
  +  | Yield of expr:BasicExpression<Keyword, Var, Literal, Position, TypeInference.Type>
   
   (*
       createElement is responsible for generating the Create() functions.
  
positive.code: 
      do process_rules classes [] rules ctxt
  
      let programTyped,_,_ = TypeInference.inferTypeAnnotations program (Extension({ Name = "___tmp" }, Position.Zero, ())) [] ctxt
  
      let classes = classes
      let extensions = @"public static class Extensions { public static V GetKey<T, V>(this System.Collections.Immutable.ImmutableDictionary<T, V> self, T key) { return self[key]; } }"
  
negative.code: *)
  type Rule = {
    Position   : Position
    Input      : BasicExpression<Keyword, Var, Literal, Position, TypeInference.Type>
    Output     : BasicExpression<Keyword, Var, Literal, Position, TypeInference.Type>
    Clauses    : List<Keyword * BasicExpression<Keyword, Var, Literal, Position, TypeInference.Type> * BasicExpression<Keyword, Var, Literal, Position, TypeInference.Type>>
    Path       : Path
    HasScope   : bool
  } with
  