anchor.diff:           O == '#{', C == '}';
            O == '<<', C == '>>' ->
     Terminators;
  -check_terminator({C, {Line, Column}}, [{Open, {{OpenLine, _}, _}}|_])
  +check_terminator({C, CMeta}, [{Open, OpenMeta}|_])
       when C == ')'; C == ']'; C == '}'; C == '>>' ->
  +  OpenLine = meta_line(OpenMeta),
     Close = terminator(Open),
  -  {error, {{Line, Column}, ?MODULE,
  +  {error, {{meta_line(CMeta), meta_column(CMeta)}, ?MODULE,
              {missing_collection_terminator, atom_to_list(C), Open, OpenLine, Close}}};
  -check_terminator({C, {Line, Column}}, [])
  +check_terminator({C, Meta}, [])
       when C == ')'; C == ']'; C == '}'; C == '>>' ->
  -  {error, {{Line, Column}, ?MODULE, {unexpected_token, atom_to_list(C)}}};
  +  {error, {{meta_line(Meta), meta_column(Meta)}, ?MODULE, {unexpected_token, atom_to_list(C)}}};
   check_terminator(_, Terminators) ->
     Terminators.
   
  
positive.code:          scan/3,
           scan/4,
           format_error/1]).
  -include("kapok.hrl").
  
  -type category() :: atom().
  
negative.code: %% Error
  
  format_error({missing_terminator, Close, Open, OpenLine}) ->
    io_lib:format("missing terminator: \"~ts\" (for \"~ts\" opening at line ~B)", [Close, Open, OpenLine]);
  format_error({invalid_n_base_char, Char, Base, Line}) ->
    io_lib:format("invalid char: ~tc for ~B-base number at line ~B", [Char, Base, Line]);
  format_error({invalid_eof, escape}) ->
  