anchor.diff:      false -> Meta3
     end.
   
  +%% @doc Read a form from the provided binary `Src'.
   -spec read(binary()) -> any().
   read(Src) ->
     read(Src, #{}).
  
positive.code: -define(GENSYM_ENV, gensym_env).
  -define(SUPPRESS_READ, suppress_read).
  
  -spec read_fold(read_fold_fun(), binary(), opts(), clj_env:env()) ->
    clj_env:env().
  read_fold(Fun, Src, Opts0, Env) ->
    %% Since we want to consume all of the source, we don't want to
    %% throw when eof is reached.
    Opts    = Opts0#{?OPT_EOF => ok},
    State   = new_state(Src, Env, Opts),
    ReadFun = read_fun(Opts),
    ok = clj_rt:reset_id(),
    read_fold_loop(Fun, ReadFun, State).
  
  -spec read_fun(opts()) -> function().
  read_fun(#{time := true}) ->
    fun time_read_one_fold/1;
  read_fun(_) ->
    fun read_one_fold/1.
  
  -spec time_read_one_fold(state()) -> state().
  time_read_one_fold(State0) ->
    {Delta, State1} = timer:tc(fun () -> read_one_fold(State0) end),
    #{env := Env0} = State1,
    Env1 = clj_env:time("Reader", Delta, Env0),
    State1#{env => Env1}.
  
  -spec read_one_fold(state()) -> state().
  read_one_fold(State) ->
    try read_one(State)
    catch throw:{eof, ok, State_} -> State_
    end.
  
  -spec read_fold_loop(read_fold_fun(), fun(), state()) -> clj_env:env().
  read_fold_loop(Fun, ReadFun, State0) ->
    case ReadFun(State0) of
      %% Only finish when there is no more source to consume
      #{src := <<>>, forms := [], env := Env0} ->
        Env0;
      State1 = #{forms := []} ->
        read_fold_loop(Fun, ReadFun, State1);
      State1 = #{forms := [Form], env := Env0} ->
        Env1 = Fun(Form, Env0),
        read_fold_loop(Fun, ReadFun, State1#{env => Env1, forms => []})
    end.
  
  -spec location_meta(any()) -> location() | ?NIL.
  location_meta(X) ->
    case clj_rt:'meta?'(X) andalso clj_rt:meta(X) of
  
negative.code:       end
    end.
  
  %% @doc Removes the location information from `Meta'.
  -spec remove_location(any()) -> any().
  remove_location(?NIL) ->
    ?NIL;
  