anchor.diff:                  ensure_type(Argument, ExpectedType)
           end,lists:zip(Got, Expected)).
   
  +%% doc: ensure_type is a special kind of type function, it not only guesses
  +%%      types, it also sets types for variables, if they havent already one,
  +%%      and throws an exception if types do not match. It is the core of type
  +%%      inference.
  +
  +-spec ensure_type(ast(),type_def()) -> ast().
   
   ensure_type(Expr = #name{ name=Name },Type) ->
       case compil_table:getType(Name) of
  
positive.code: scan_free(_Other, _Env) ->
      done.
  
  
  add_free_var(Ref,Name) ->
      { _ , Members }  = lists:unzip(compil_table:getMembersEnv(Ref)),
  
negative.code:         type                :: type_def()
      }).
  
  -type env_ref() :: reference() | global.
  -record(lambda, {
  	  ref                   :: env_ref(), % unique reference for symbol table
        label                 :: string(),    % name in llvm code
        type                  :: #typeFun{},
        definitions           :: #nameDef{},  % names introduced by this functions
  