anchor.diff:  
   get_name({declaration, _,
             {dim_decl, _, {id, _, Name}, _Body}= Decl}) ->
  -    {Name, Decl};
  +    {Name, dim, Decl};
   get_name({declaration, _,
             {var_decl, _, {id, _, Name}, _Body} = Decl}) ->
  -    {Name, Decl};
  +    {Name, var, Decl};
   get_name({declaration, _,
             {fun_decl, _, {id, _, Name}, _Params, _Body} = Decl}) ->
  -    {Name, Decl};
  +    {Name, var, Decl};
   get_name(X) ->
  -    {nodecl, X}.
  +    throw({nodecl, expr, X}).
   
   expr_where_defs(Expr, Defs) ->
  -    Dims = [Def || {_Name, {dim_decl, _, _, _} = Def} <- Defs],
  -    Vars = [Def || {_Name, Def} <- Defs ] -- Dims,
  +    Dims = [Def || {_Name, dim, Def} <- Defs],
  +    Vars = [Def || {_Name, var, Def} <- Defs ],
       ice_ast:transform([{expr, 0, {where, 0, Expr, Dims, Vars}}]).
   
   print(Defs) ->
  -    [io:format("~s: ~p\n", [Name, Def]) || {Name, Def} <- Defs],
  +    [io:format("~s ~s: ~p\n", [T, Name, Def]) || {Name, T, Def} <- Defs],
       ok.
   
  -do_query(Q, #state{defs = Defs, cache = C} = S, TC) ->
  +do_query(Q, #state{defs = Defs} = S, TC) ->
       try
           QQ = expr_where_defs(Q, Defs),
           case TC of
               no_tc ->
  -                {Res, _} = eval(QQ,C),
  +                {Res, _} = ice:eval(QQ),
                   io:format("~p\n", [Res]);
               tc ->
  -                {US, {R, _}} = timer:tc(fun() -> eval(QQ,C) end),
  +                {US, {R, _}} = timer:tc(ice, eval, [QQ]),
                   io:format("(~fs) ~p\n", [US/1000/1000, R])
           end,
           S
  
positive.code:     {Lines, Files} = arg_parse(Args, [], []),
      S0 = load_files(Files, #state{}),
      error_logger:tty(false),
      case Lines of
          [] ->
              interactive(S0);
  
negative.code:             {command, time};
          {match, ["t", Expr]} ->
              {command, {time_expr, Expr}};
          {match, ["l", File]} ->
              {command, {l, File}};
          {match, [C|_]} ->
  