anchor.diff:  
   eval_ast({ast, type, casgn, children, [ParentConstAst, Name, ValAst] }, Env) ->
     ParentConstEnv = parent_const_env(ParentConstAst, Env),
  -  #{ret_val := ParentConst} = ParentConstEnv,
  +  ParentConst = erruby_rb:ret_val(ParentConstEnv),
     NewEnv = eval_ast(ValAst, ParentConstEnv),
  -  #{ret_val := Val} = NewEnv,
  +  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),
  -  #{ret_val := ParentConst} = ParentConstEnv,
  +  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);
  
positive.code:   erruby_boolean:new_false(Env);
  
  eval_ast({ast, type, array, children, Args}, Env) ->
    [_ |Envs] = scanl(fun eval_ast/2, Env, Args),
    EvaledArgs = lists:map( fun erruby_rb:ret_val/1, Envs),
    LastEnv = lists:last(Envs),
    erruby_array:new_array(LastEnv, EvaledArgs);
  
  eval_ast({ast, type, int, children, [N]}, Env) ->
  
negative.code:   Result#{block => not_exist};
  
  eval_ast({ast, type, yield, children, Args}, Env) ->
    {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),
    RetVal = erruby_rb:ret_val(NewEnv),
    bind_lvar(Name, RetVal, NewEnv);
  
  eval_ast({ast, type, lvar, children, [Name]}, Env) ->
  