/******************************************************************
 * evaluate.h
 * Definitions for the evaluation tasks.
 ******************************************************************/
#ifndef __EVALUATE
#define __EVALUATE


/******************************************************************
 * PROTO DEFS:
 ******************************************************************/
uMonitor FUTURE;
uMonitor SYMTABLE;
struct ATOM;
uTask EVALUATE;
uMonitor ATOM_MNGR;

/******************************************************************
 * FUNCTION PROTOTYPES
 ******************************************************************/
EVALUATE *CreateEvaluator();

/******************************************************************
 * TASKS:
 ******************************************************************/
uTask EVALUATE
{
    SYMTABLE  *m_glbsym;
    SYMTABLE  *m_lclsym;
    FUTURE    *m_future;
    ATOM      *m_atom;
    uCondition m_wait;
    int        m_done;
    ATOM_MNGR *m_atommngr;

    void main();

    ATOM *evaluate(ATOM *atom, SYMTABLE *local, int ignoreFLIST=0); // Recursive!
    ATOM *RunFunction(ATOM *fnc, SYMTABLE *local);
public:
    EVALUATE(SYMTABLE *global, SYMTABLE *local);
    ~EVALUATE();

    ATOM *evaluateAtom(ATOM *atom);
    ATOM *evaluateAtomGlobal(ATOM *atom);
    ATOM *evaluateAtom(ATOM *atom, SYMTABLE *local);
    ATOM *evalFuture(ATOM *atom);       // Deletes this when done!
    ATOM_MNGR *getAtomManager() { return m_atommngr; }
};

#endif
