anchor.diff:    end.
   
   bind(Var, ScopeEnv) when is_atom(Var) ->
  -  case es_env:lookup(ScopeEnv, Var) of
  -    none ->
  -      es_env:enter(ScopeEnv, Var, []);
  -    _ ->
  -      erlang:throw({bad_var, Var})
  +  case es_env:is_bound(ScopeEnv, Var) of
  +    true -> erlang:throw({already_bound, Var});
  +    false -> es_env:enter(ScopeEnv, Var, [])
     end.
   
   parse_let(Tl, Env) ->
  
positive.code:     [M, ':', F, '/', A] ->
        {'ES:PRIMOP', 'ES:COLON', [quote_if_glovar(parse(M, Env)), quote_if_glovar(parse(F, Env)), parse(A, Env)]};
      [Formals, Body] ->
        ScopeEnv = parse_formals(Formals, es_env:empty()),
        {'ES:LAMBDA', Formals, parse(Body, es_env:overlay(Env, ScopeEnv))};
      _ ->
        erlang:throw({bad_lambda, Tl})
    end.
  
  quote_if_glovar(AST) ->
    case AST of
  
negative.code: %%%
  %%% Parses a top-level S-expression and converts it to an abstract syntax
  %%% tree (AST).
  %%%
  %%% Checks bindings, variable references, and export declarations. (This is not
  %%% postponed to a "lint" module since this processing is needed anyway in order
  %%% to generate correct AST for variable references and ":" operands.)
  %%%
  %%% Notes:
  %%% - Variadic functions (with "rest" parameters) are not supported, since
  