0,0 → 1,145 |
/// \file |
/// Definitions of DefaultYacasEnvironment and CYacas. |
|
#ifndef __yacas_h__ |
#define __yacas_h__ |
|
#include "yacasbase.h" |
#include "lispstring.h" |
#include "stringio.h" |
#include "tokenizer.h" |
#include "lisphash.h" |
#include "lispevalhash.h" |
#include "infixparser.h" |
#include "stdfileio.h" |
#include "lispatom.h" |
#include "lispeval.h" |
#include "mathenvironment.h" |
#include "lispglobals.h" |
#include "lisperror.h" |
#include "lispuserfunc.h" |
|
|
/// The default environment for a Yacas session. |
/// This class constructs a LispEnvironment (to be found in |
/// #iEnvironment), and defines the Yacas core functions. The core |
/// functions are listed in corefunctions.h . Examples of core |
/// functions are \c Head, \c Set and \c Eval. |
|
class DefaultYacasEnvironment : public YacasBase |
{ |
public: |
DefaultYacasEnvironment(); |
DefaultYacasEnvironment(LispOutput* aOutput, LispInt aStackSize); |
virtual ~DefaultYacasEnvironment(); |
LispEnvironment& getEnv() {return iEnvironment;} |
|
private: |
DefaultYacasEnvironment(const DefaultYacasEnvironment& aOther) |
: output(NULL),hash(),printer(),coreCommands(),globals(),prefixoperators(),infixoperators(),postfixoperators(),bodiedoperators(),infixprinter(aOther.infixprinter),userFunctions(), |
iEnvironment(coreCommands,userFunctions, |
globals,hash,output,infixprinter, |
prefixoperators,infixoperators, |
postfixoperators,bodiedoperators,&input,0), |
input(aOther.input.Status()) |
{ |
// copy constructor not written yet, hence the assert |
LISPASSERT(0); |
} |
DefaultYacasEnvironment& operator=(const DefaultYacasEnvironment& aOther) |
{ |
// copy constructor not written yet, hence the assert |
LISPASSERT(0); |
return *this; |
} |
|
private: |
LispOutput* output; |
LispHashTable hash; |
LispPrinter printer; |
|
YacasCoreCommands coreCommands; |
LispGlobal globals; |
|
//Define the default operators. |
LispOperators prefixoperators; |
LispOperators infixoperators; |
LispOperators postfixoperators; |
LispOperators bodiedoperators; |
InfixPrinter infixprinter; |
|
LispUserFunctions userFunctions; |
|
LispEnvironment iEnvironment; |
|
public: |
CachedStdUserInput input; |
}; |
|
|
/// The Yacas engine. |
/// This is the only class that applications need to use. It can |
/// evaluate Yacas expressions. Every instance has its own Yacas |
/// environment, in which the expressions are evaluated. |
|
|
|
class CYacas : public YacasBase |
{ |
public: |
|
/// Pseudo-constructor. |
/// \return A new instance of CYacas, with output connected to \p aOutput. |
/// If aOutput is NULL, connect to a new instance of StdUserOutput. |
LISPIMPORT static CYacas* NewL(LispOutput* aOutput=0, LispInt aStackSize=50000); |
|
/// Destructor. |
LISPIMPORT virtual ~CYacas(); |
|
/// Return the underlying Yacas environment. |
inline DefaultYacasEnvironment& getDefEnv() {return environment;} |
|
/// Evaluate a Yacas expression. |
/// First, \p aExpression is parsed by an InfixParser. Then it is |
/// evaluated in the underlying Lisp environment. Finally, the |
/// result is printed to #iResultOutput via the pretty printer or, |
/// if this is not defined, via an InfixPrinter. |
virtual void Evaluate(const LispChar * aExpression); |
|
/// Return the result of the expression. |
/// This is stored in #iResult. |
virtual LispChar * Result(); |
|
/// Return the error message produced by the last evaluation. |
/// The error is retrieved from #environment. |
virtual LispChar * Error(); |
|
/// Whether an error occured during the last evaluation. |
inline LispBoolean IsError(); |
|
private: |
|
/// Constructor. |
/// The output of #environment is directed to \p aOutput. |
CYacas(LispOutput* aOutput,LispInt aStackSize); |
|
private: |
|
/// The underlying Yacas environment |
DefaultYacasEnvironment environment; |
|
/// String containing the result of the last evaluation |
LispString iResult; |
|
/// Stream pointing to #iResult. |
StringOutput iResultOutput; |
}; |
|
inline LispBoolean CYacas::IsError() |
{ |
return (Error()[0] != '\0'); |
} |
|
#endif |
|
|