4
#include "lispenvironment.h"
8
#include "lispparser.h"
11
#include "lisperror.h"
12
#include "infixparser.h"
13
#include "lispuserfunc.h"
14
#include "mathuserfunc.h"
18
#include "arrayclass.h"
19
#include "patternclass.h"
20
#include "substitute.h"
23
#define InternalEval aEnvironment.iEvaluator->Eval
26
void LispSubst(LispEnvironment& aEnvironment, LispPtr& aResult,
32
InternalEval(aEnvironment, from, Argument(aArguments,1));
33
InternalEval(aEnvironment, to , Argument(aArguments,2));
34
InternalEval(aEnvironment, body, Argument(aArguments,3));
35
SubstBehaviour behaviour(aEnvironment,from, to);
36
InternalSubstitute(aResult, body, behaviour);
40
void LispLocalSymbols(LispEnvironment& aEnvironment, LispPtr& aResult,
43
LispInt nrArguments = InternalListLength(aArguments);
45
LispInt nrSymbols = nrArguments-2;
47
LispStringPtr *names = (LispStringPtr *)PlatAlloc(sizeof(LispStringPtr)*nrSymbols);
48
LispStringPtr *localnames = (LispStringPtr *)PlatAlloc(sizeof(LispStringPtr)*nrSymbols);
49
//TODO names and localnames should be pushed on the cleanup stack!!!
50
CHK(names != NULL,KLispErrNotEnoughMemory);
51
CHK(localnames != NULL,KLispErrNotEnoughMemory);
53
LispInt uniquenumber = aEnvironment.GetUniqueId();
55
for (i=0;i<nrSymbols;i++)
57
LispStringPtr atomname = Argument(aArguments, i+1).Get()->String();
58
CHK_ARG(atomname != NULL, i+1);
61
LispInt len = atomname->NrItems()-1;
65
PlatMemCopy(&newname[1], atomname->String(), len);
67
InternalIntToAscii(&newname[1+len],uniquenumber);
68
LispStringPtr variable = aEnvironment.HashTable().LookUp(newname);
69
localnames[i] = variable;
70
aEnvironment.NewLocal(variable,NULL);
74
LocalSymbolBehaviour behaviour(names,localnames,nrSymbols);
76
InternalSubstitute(result, Argument(aArguments, nrArguments-1), behaviour);
81
InternalEval(aEnvironment, aResult, result);