if (bucket->current_binding->env == env) throw AlreadyDefined(); bucket->current_binding = new Entry(env, bucket, bucket->current_binding, value);
if (bucket->current_binding && bucket->current_binding->env == env) bucket->current_binding->value = value; else { bucket->current_binding = new Entry(env, bucket, bucket->current_binding, env->first, value); env->first = bucket->current_binding; }
  void set(const K& key, T value)  {    Bucket* bucket;    typename Map::iterator p = map.find(key);    if (p == map.end())      bucket = map[key] = new Bucket(key);    else      bucket = p->second;    if (bucket->current_binding->env == env)      throw AlreadyDefined();    bucket->current_binding = new Entry(env, bucket, bucket->current_binding, value);  }