anchor.diff:      scan_macros_1([], Rest, [{atom,L,macro_atom(Type,LA,A)} | As], Opt).
   
   macro_call([{'(',_}, {')',_}], L, {_, Ln, _}=N, Rest, As, Opt) ->
  -    {Open, Close} = parentheses(As),
  +    {Open, Close} = parentheses(As, L),
       scan_macros_1([], Rest,
   		  lists:reverse(Open ++ [{atom,L,?macro_call},
   					 {'(',L}, N, {')',Ln}] ++ Close,
   				As), Opt);
   macro_call([{'(',_} | Args], L, {_, Ln, _}=N, Rest, As, Opt) ->
  -    {Open, Close} = parentheses(As),
  +    {Open, Close} = parentheses(As, L),
       %% note that we must scan the argument list; it may not be skipped
       scan_macros_1(Args ++ Close,
   		  Rest,
  
positive.code: %% don't insert parentheses after a string token, to avoid turning
  %% `"string" ?macro' into a "function application" `"string"(...)'
  %% (see note at top of file)
  parentheses([{string, _, _} | _]) ->
      {[], []};
  parentheses(_) ->
      {[{'(',0}], [{')',0}]}.
  
  %% (after a macro has been found and the arglist skipped, if any)
  scan_macros_1(Args, [{string, L, _} | _]=Rest, As,
  
negative.code: 		     L1};
                  {parse_error, IoErr} ->
  		    {error, IoErr, L1};
  		{parse_error, IoErr, Range} ->
  		    {error, {IoErr, Range}, L1};
                  {ok, F} ->
  		    {ok, F, L1}
              end;
  