anchor.diff:    Result#{block => not_exist};
   
   eval_ast({ast, type, yield, children, Args}, Env) ->
  -  [_ |Envs] = scanl(fun eval_ast/2, Env, Args),
  -  EvaledArgs = lists:map( fun erruby_rb:ret_val/1, Envs),
  -  LastEnv = case Envs of
  -              [] -> Env;
  -              _ -> lists:last(Envs)
  -            end,
  +  {EvaledArgs, LastEnv} = eval_args(Args, Env),
     yield(LastEnv, EvaledArgs);
   
   eval_ast({ast, type, lvasgn, children, Children}, Env) ->
     [Name, ValAst] = Children,
     NewEnv = eval_ast(ValAst, Env),
  -  #{ret_val := RetVal } = NewEnv,
  +  RetVal = erruby_rb:ret_val(NewEnv),
     bind_lvar(Name, RetVal, NewEnv);
   
   eval_ast({ast, type, lvar, children, [Name]}, Env) ->
  
positive.code:     {ast, type, const, children, _} -> eval_ast(ParentConstAst, Env)
    end.
  
  yield(Env, Args)->
    Block = find_block(Env),
    #{body := Body, args := {ast, type, args, children, ArgNamesAst}} = Block,
  
negative.code: 
  eval_ast({ast, type, casgn, children, [ParentConstAst, Name, ValAst] }, Env) ->
    ParentConstEnv = parent_const_env(ParentConstAst, Env),
    ParentConst = erruby_rb:ret_val(ParentConstEnv),
    NewEnv = eval_ast(ValAst, ParentConstEnv),
    Val = erruby_rb:ret_val(NewEnv),
    erruby_object:def_const(ParentConst, Name, Val),
    NewEnv;
  
  %TODO throw error when not_found
  eval_ast({ast, type, const, children, [ParentConstAst, Name]}, Env) ->
    ParentConstEnv = parent_const_env(ParentConstAst, Env),
    ParentConst = erruby_rb:ret_val(ParentConstEnv),
    LocalConst = erruby_object:find_const(ParentConst, Name),
    Const = case LocalConst of
              not_found -> erruby_object:find_const(erruby_object:object_class(), Name);
  