#include "Node.h"

// oop mParent;

Environment::Environment(oop parent)
{
  mParent= parent;
}

oop Environment::declare(oop name, oop node)
{
  if (includesKey(name))
    error("%s is already declared", name->cString());
  return atPut(name, node);
}

oop Environment::lookup(oop name)
{
  extern char *yyFile;
  extern int yyLine;
  oop value= atOrNil(name);
  if (value) return value;
  if (mParent) value= mParent->lookup(name);
  if (value) return value;
  return error("%s:%d: %s is undeclared", yyFile, yyLine, name->cString());
}

oop Environment::lookupOrNil(oop name)
{
  oop value= atOrNil(name);
  if (value) return value;
  if (mParent) return mParent->lookupOrNil(name);
  return 0;
}
