anchor.diff:  %% e.g. ehtml_var_name('$foo') -> foo.
   ehtml_var_name(A) when atom(A) ->
       case ehtml_var_p(A) of
  -	true ->
  -	    list_to_atom(tl(atom_to_list(A)));
  -	false ->
  -	    exit({bad_ehtml_var_name, A})
  +	true -> list_to_atom(tl(atom_to_list(A)));
  +	false -> exit({bad_ehtml_var_name, A})
       end.
   
   %% Is X a variable reference? Variable references are atoms starting with $.
  -ehtml_var_p(X) when atom(X) ->
  -    hd(atom_to_list(X)) == $$;
  -ehtml_var_p(_) ->
  -    false.
  +ehtml_var_p(X) when atom(X) -> hd(atom_to_list(X)) == $$;
  +ehtml_var_p(_) -> false.
   
   ehtml_expander_test() ->
       %% Expr is a template containing variables.
  
positive.code: %% Var = atom()
  ehtml_expander_compress([Tag|T], Acc) when tuple(Tag) ->
      [list_to_binary(reverse(Acc)), Tag | ehtml_expander_compress(T, [])];
  ehtml_expander_compress([], Acc) ->
      [list_to_binary(reverse(Acc))];
  ehtml_expander_compress([H|T], Acc) when integer(H) ->
      ehtml_expander_compress(T, [H|Acc]).
  
  %% Apply an expander with the variable bindings in Env.  Env is a list of
  %% {VarName, Value} tuples, where VarName is an atom and Value is an ehtml
  %% term.
  ehtml_apply(Expander, Env) ->
      [ehtml_eval(X, Env) || X <- Expander].
  
  ehtml_eval(Bin, Env) when binary(Bin) ->
      Bin;
  ehtml_eval({Type, Var}, Env) ->
      case lists:keysearch(Var, 1, Env) of
  	false ->
  	    exit({ehtml_unbound, Var});
  	{value, {Var, Val}} ->
  	    case Type of
  		ehtml ->
  		    ehtml_expand(Val);
  		preformatted ->
  		    Val;
  		ehtml_attrs ->
  		    ehtml_attrs(Val)
  	    end
      end.
  
  
negative.code: 	true  -> {preformatted, ehtml_var_name(A)};
  	false -> atom_to_list(A)
      end;
  ehtml_attr_part_expander(I) when integer(I) -> integer_to_list(I);
  ehtml_attr_part_expander(S) when list(S) -> S.
  
  ehtml_expander_done(X, Before, After) -> [reverse([X|Before]), After].
  
  %% Compress an EHTML expander, converting all adjacent bits of text into
  %% binaries.
  