kolibrios-gitea/contrib/media/updf/include/yacas.h

146 lines
4.0 KiB
C
Raw Normal View History

/// \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