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"
22
#include "arggetter.h"
24
#define InternalEval aEnvironment.iEvaluator->Eval
28
void LispLexCompare2(LispEnvironment& aEnvironment, LispPtr& aResult,
30
LispBoolean (*lexfunc)(LispCharPtr f1, LispCharPtr f2, LispHashTable& aHashTable,LispInt aPrecision),
31
LispBoolean (*numfunc)(LispCharPtr f1, LispCharPtr f2, LispHashTable& aHashTable,LispInt aPrecision)
35
void LispQuote(LispEnvironment& aEnvironment,
40
aResult.Set(Argument(aArguments,1).Get()->Copy(LispFalse));
43
/*TODO remove? just an experiment, didn't pan out it seems
48
inline CArgs(LispPtr& aArguments,LispEnvironment& aEnvironment);
49
inline LispPtr& Arg(LispInt aIndex);
50
inline void Eval(LispInt aIndex);
52
LispEnvironment& iEnvironment;
56
inline CArgs<T>::CArgs(LispPtr& aArguments,LispEnvironment& aEnvironment)
57
: iEnvironment(aEnvironment)
59
LISPASSERT(aArguments.Get() != NULL);
60
LispPtr* ptr = &aArguments.Get()->Next();
65
ptr = &ptr->Get()->Next();
67
if (ptr->Get() != NULL)
69
ErrorNrArgs(T, InternalListLength(aArguments)-1, aArguments, aEnvironment);
74
inline LispPtr& CArgs<T>::Arg(LispInt aIndex)
76
LISPASSERT(aIndex >= 0 && aIndex < T);
77
return *iArgs[aIndex];
81
inline void CArgs<T>::Eval(LispInt aIndex)
84
iEnvironment.iEvaluator->Eval(iEnvironment, result, iArgs[aIndex]);
85
iArgs[aIndex].Set(result.Get());
90
void LispEval(LispEnvironment& aEnvironment,LispPtr& aResult,
93
/*TODO remove? just an experiment, didn't pan out it seems
94
CArgs<1> args(aArguments,aEnvironment);
96
InternalEval(aEnvironment, result, args.Arg(0));
97
InternalEval(aEnvironment, aResult, result);
102
InternalEval(aEnvironment, result, Argument(aArguments,1));
103
InternalEval(aEnvironment, aResult, result);
106
static void InternalSetVar(LispEnvironment& aEnvironment, LispPtr& aResult,
107
LispPtr& aArguments,LispBoolean aMacroMode)
111
LispStringPtr varstring=NULL;
116
InternalEval(aEnvironment, result, Argument(aArguments,1));
117
varstring = result.Get()->String();
121
varstring = Argument(aArguments,1).Get()->String();
123
CHK_ARG(varstring != NULL,1);
124
CHK_ARG(!IsNumber(varstring->String(),LispTrue),1);
127
InternalEval(aEnvironment, result, Argument(aArguments,2));
128
aEnvironment.SetVariable(varstring, result);
129
InternalTrue(aEnvironment,aResult);
133
void LispSetVar(LispEnvironment& aEnvironment, LispPtr& aResult,
136
InternalSetVar(aEnvironment, aResult,aArguments,LispFalse);
138
void LispMacroSetVar(LispEnvironment& aEnvironment, LispPtr& aResult,
141
InternalSetVar(aEnvironment, aResult,aArguments,LispTrue);
145
static void InternalClearVar(LispEnvironment& aEnvironment,
146
LispPtr& aResult, LispPtr& aArguments,
147
LispBoolean aMacroMode)
149
LispIterator iter(Argument(aArguments,1));
158
InternalEval(aEnvironment, result, *iter.Ptr());
159
str = result.Get()->String();
163
str = iter()->String();
166
CHK_ARG(str != NULL, nr);
167
aEnvironment.UnsetVariable(str);
171
InternalTrue(aEnvironment,aResult);
174
void LispClearVar(LispEnvironment& aEnvironment,
175
LispPtr& aResult,LispPtr& aArguments)
177
InternalClearVar(aEnvironment,aResult, aArguments, LispFalse);
179
void LispMacroClearVar(LispEnvironment& aEnvironment,
180
LispPtr& aResult,LispPtr& aArguments)
182
InternalClearVar(aEnvironment,aResult, aArguments, LispTrue);
187
/* StrCompare returns f1-f2: if f1 < f2 it returns -1, if f1=f2 it
188
returns 0, and it returns 1 if f1>f2
191
static LispBoolean LexLessThan(LispCharPtr f1, LispCharPtr f2, LispHashTable& aHashTable,LispInt aPrecision)
193
return (StrCompare(f1, f2)<0);
196
static LispBoolean LexGreaterThan(LispCharPtr f1, LispCharPtr f2, LispHashTable& aHashTable,LispInt aPrecision)
198
return (StrCompare(f1, f2)>0);
202
void LispLessThan(LispEnvironment& aEnvironment, LispPtr& aResult,
205
LispLexCompare2(aEnvironment, aResult, aArguments, LexLessThan,LessThan);
208
void LispGreaterThan(LispEnvironment& aEnvironment, LispPtr& aResult,
211
LispLexCompare2(aEnvironment, aResult, aArguments, LexGreaterThan, GreaterThan);
215
void LispLexCompare2(LispEnvironment& aEnvironment, LispPtr& aResult,
217
LispBoolean (*lexfunc)(LispCharPtr f1, LispCharPtr f2, LispHashTable& aHashTable,LispInt aPrecision),
218
LispBoolean (*numfunc)(LispCharPtr f1, LispCharPtr f2, LispHashTable& aHashTable,LispInt aPrecision)
228
InternalEval(aEnvironment, result1, Argument(aArguments,1));
229
InternalEval(aEnvironment, result2, Argument(aArguments,2));
231
str1 = result1.Get()->String();
232
str2 = result2.Get()->String();
233
CHK_ARG(str1 != NULL ,1);
234
CHK_ARG(str2 != NULL, 2);
237
if (IsNumber(str1->String(),LispTrue) &&
238
IsNumber(str2->String(),LispTrue))
240
cmp =numfunc(str1->String(),str2->String(),
241
aEnvironment.HashTable(),
242
aEnvironment.Precision());
246
cmp =lexfunc(str1->String(),str2->String(),
247
aEnvironment.HashTable(),
248
aEnvironment.Precision());
251
InternalBoolean(aEnvironment,aResult, cmp);
254
void LispPi(LispEnvironment& aEnvironment, LispPtr& aResult,
258
aResult.Set(LispAtom::New(PiFloat(aEnvironment.HashTable(),
259
aEnvironment.Precision())));
264
void LispGcd(LispEnvironment& aEnvironment, LispPtr& aResult,
267
LispArgGetter g(aEnvironment, aArguments);
268
IntegerArgument(g,str1,LispTrue);
269
IntegerArgument(g,str2,LispTrue);
271
aResult.Set(LispAtom::New(GcdInteger(str1->String(),str2->String(),
272
aEnvironment.HashTable())));
275
void LispFullForm(LispEnvironment& aEnvironment, LispPtr& aResult,
278
InternalEval(aEnvironment, aResult, Argument(aArguments,1));
280
StdUserOutput output;
281
printer.Print(aResult, output, aEnvironment);
286
void LispHead(LispEnvironment& aEnvironment, LispPtr& aResult,
289
LispArgGetter g(aEnvironment, aArguments);
290
ListArgument(g,list,LispTrue);
292
InternalNth(aResult, list,1);
295
void LispNth(LispEnvironment& aEnvironment, LispPtr& aResult,
298
LispArgGetter g(aEnvironment, aArguments);
299
ListArgument(g,list,LispTrue);
300
ShortIntegerArgument(g,index,LispTrue);
302
InternalNth(aResult, list, index);
306
void LispTail(LispEnvironment& aEnvironment, LispPtr& aResult,
309
LispArgGetter g(aEnvironment, aArguments);
310
ListArgument(g,list,LispTrue);
314
InternalTail(first, list);
315
InternalTail(aResult, first);
317
head.Set(LispAtom::New(aEnvironment.iList));
318
head.Get()->Next().Set(aResult.Get()->SubList()->Get());
319
aResult.Get()->SubList()->Set(head.Get());
322
void LispUnList(LispEnvironment& aEnvironment, LispPtr& aResult,
325
LispArgGetter g(aEnvironment, aArguments);
326
ListArgument(g,list,LispTrue);
328
InternalTail(aResult, list);
331
void LispListify(LispEnvironment& aEnvironment, LispPtr& aResult,
334
LispArgGetter g(aEnvironment, aArguments);
335
ListArgument(g,list,LispTrue);
339
head.Set(LispAtom::New(aEnvironment.iList));
340
head.Get()->Next().Set(list.Get()->SubList()->Get());
341
aResult.Set(LispSubList::New(head.Get()));
347
void LispDestructiveReverse(LispEnvironment& aEnvironment, LispPtr& aResult,
350
LispArgGetter g(aEnvironment, aArguments);
351
ListArgument(g,list,LispTrue);
355
reversed.Set(LispAtom::New(aEnvironment.iList));
356
InternalReverseList(reversed.Get()->Next(), list.Get()->SubList()->Get()->Next());
357
aResult.Set(LispSubList::New(reversed.Get()));
361
void LispLength(LispEnvironment& aEnvironment, LispPtr& aResult,
366
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
368
LispPtr* subList = evaluated.Get()->SubList();
372
LispInt num = InternalListLength(subList->Get()->Next());
373
InternalIntToAscii(s,num);
374
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(s)));
377
LispStringPtr string = evaluated.Get()->String();
378
if (InternalIsString(string))
381
LispInt num = string->NrItems()-3;
382
InternalIntToAscii(s,num);
383
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(s)));
386
GenericClass *gen = evaluated.Get()->Generic();
388
if (StrEqual(gen->TypeName(),"\"Array\""))
390
LispInt size=((ArrayClass*)gen)->Size();
392
InternalIntToAscii(s,size);
393
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(s)));
396
CHK_ISLIST(evaluated,1);
400
void LispList(LispEnvironment& aEnvironment, LispPtr& aResult,
404
all.Set(LispAtom::New(aEnvironment.iList));
405
LispIterator tail(all);
407
LispIterator iter = Argument(aArguments,1);
411
InternalEval(aEnvironment, evaluated, *iter.Ptr());
412
tail.Ptr()->Set(evaluated.Get());
417
aResult.Set(LispSubList::New(all.Get()));
421
void LispConcatenate(LispEnvironment& aEnvironment, LispPtr& aResult,
425
all.Set(LispAtom::New(aEnvironment.iList));
426
LispIterator tail(all);
430
LispIterator iter = Argument(aArguments,1);
434
InternalEval(aEnvironment, evaluated, *iter.Ptr());
435
CHK_ISLIST(evaluated,arg);
436
InternalFlatCopy(*tail.Ptr(),evaluated.Get()->SubList()->Get()->Next());
437
while (tail() != NULL)
444
aResult.Set(LispSubList::New(all.Get()));
448
static void ConcatenateStrings(LispStringSmartPtr& aSmartPtr, LispEnvironment& aEnvironment, LispPtr& aResult,
451
LISPASSERT(aSmartPtr());
452
aSmartPtr()->SetNrItems(0);
453
aSmartPtr()->Append('\"');
456
LispIterator iter = Argument(aArguments,1);
460
InternalEval(aEnvironment, evaluated, *iter.Ptr());
461
CHK_ISSTRING(evaluated,arg);
463
LispInt length = evaluated.Get()->String()->NrItems()-2;
464
LispCharPtr ptr=evaluated.Get()->String()->String();
466
LispInt curlen = aSmartPtr()->NrItems();
467
aSmartPtr()->GrowTo(curlen+length-1);
468
LispCharPtr put = &(*aSmartPtr())[curlen-1];
469
PlatMemCopy(put+1,ptr+1,length-1);
474
aSmartPtr()->Append('\"');
475
aSmartPtr()->Append('\0');
477
void LispConcatenateStrings(LispEnvironment& aEnvironment, LispPtr& aResult,
480
LispString *str = NEW LispString;
481
LispStringSmartPtr smartptr;
483
ConcatenateStrings(smartptr,aEnvironment, aResult, aArguments);
484
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(str)));
487
static void InternalDelete(LispEnvironment& aEnvironment, LispPtr& aResult,
488
LispPtr& aArguments, LispInt aDestructive)
492
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
493
CHK_ISLIST(evaluated,1);
498
copied.Set(evaluated.Get()->SubList()->Get());
502
InternalFlatCopy(copied,*evaluated.Get()->SubList());
506
InternalEval(aEnvironment, index, Argument(aArguments,2));
507
CHK_ARG(index.Get() != NULL, 2);
508
CHK_ARG(index.Get()->String() != NULL, 2);
509
LispInt ind = InternalAsciiToInt(index.Get()->String()->String());
512
LispIterator iter(copied);
518
CHK(iter() != NULL, KLispErrListNotLongEnough);
520
next.Set(iter()->Next().Get());
521
iter.Ptr()->Set(next.Get());
522
aResult.Set(LispSubList::New(copied.Get()));
524
void LispDelete(LispEnvironment& aEnvironment, LispPtr& aResult,
527
InternalDelete(aEnvironment, aResult,aArguments,LispFalse);
529
void LispDestructiveDelete(LispEnvironment& aEnvironment, LispPtr& aResult,
532
InternalDelete(aEnvironment, aResult,aArguments,LispTrue);
535
void LispFlatCopy(LispEnvironment& aEnvironment, LispPtr& aResult,
538
LispArgGetter g(aEnvironment, aArguments);
539
ListArgument(g,list,LispTrue);
542
InternalFlatCopy(copied,*list.Get()->SubList());
543
aResult.Set(LispSubList::New(copied.Get()));
547
static void InternalInsert(LispEnvironment& aEnvironment, LispPtr& aResult,
548
LispPtr& aArguments, LispInt aDestructive)
552
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
553
CHK_ISLIST(evaluated,1);
558
copied.Set(evaluated.Get()->SubList()->Get());
562
InternalFlatCopy(copied,*evaluated.Get()->SubList());
566
InternalEval(aEnvironment, index, Argument(aArguments,2));
567
CHK_ARG(index.Get() != NULL, 2);
568
CHK_ARG(index.Get()->String() != NULL, 2);
569
LispInt ind = InternalAsciiToInt(index.Get()->String()->String());
572
LispIterator iter(copied);
580
InternalEval(aEnvironment, toInsert, Argument(aArguments,3));
581
toInsert.Get()->Next().Set(iter());
582
iter.Ptr()->Set(toInsert.Get());
583
aResult.Set(LispSubList::New(copied.Get()));
586
void LispInsert(LispEnvironment& aEnvironment, LispPtr& aResult,
589
InternalInsert(aEnvironment, aResult,aArguments,LispFalse);
592
void LispDestructiveInsert(LispEnvironment& aEnvironment, LispPtr& aResult,
595
InternalInsert(aEnvironment, aResult,aArguments,LispTrue);
604
static void InternalReplace(LispEnvironment& aEnvironment, LispPtr& aResult,
605
LispPtr& aArguments, LispInt aDestructive)
609
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
610
CHK_ISLIST(evaluated,1);
613
InternalEval(aEnvironment, index, Argument(aArguments,2));
614
CHK_ARG(index.Get() != NULL, 2);
615
CHK_ARG(index.Get()->String() != NULL, 2);
616
LispInt ind = InternalAsciiToInt(index.Get()->String()->String());
621
copied.Set(evaluated.Get()->SubList()->Get());
625
InternalFlatCopy(copied,*evaluated.Get()->SubList());
629
LispIterator iter(copied);
637
InternalEval(aEnvironment, toInsert, Argument(aArguments,3));
638
CHK_ARG(iter.Ptr() != NULL, 2);
639
CHK_ARG(iter.Ptr()->Get() != NULL, 2);
640
toInsert.Get()->Next().Set(iter.Ptr()->Get()->Next().Get());
641
iter.Ptr()->Set(toInsert.Get());
642
aResult.Set(LispSubList::New(copied.Get()));
645
void LispReplace(LispEnvironment& aEnvironment, LispPtr& aResult,
648
InternalReplace(aEnvironment, aResult,aArguments,LispFalse);
651
void LispDestructiveReplace(LispEnvironment& aEnvironment, LispPtr& aResult,
654
InternalReplace(aEnvironment, aResult,aArguments,LispTrue);
672
void LispNot(LispEnvironment& aEnvironment, LispPtr& aResult,
677
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
678
if (IsTrue(aEnvironment, evaluated) || IsFalse(aEnvironment, evaluated))
680
InternalNot(aResult, aEnvironment, evaluated);
685
ptr.Set(aArguments.Get()->Copy(LispFalse));
686
ptr.Get()->Next().Set(evaluated.Get());
687
aResult.Set(LispSubList::New(ptr.Get()));
691
void LispLazyAnd(LispEnvironment& aEnvironment, LispPtr& aResult,
698
LispIterator iter(Argument(aArguments,1));
701
InternalEval(aEnvironment, evaluated, *iter.Ptr());
702
if (IsFalse(aEnvironment, evaluated))
704
InternalFalse(aEnvironment,aResult);
707
else if (!IsTrue(aEnvironment, evaluated))
711
ptr.Set(evaluated.Get()->Copy(LispFalse));
712
ptr.Get()->Next().Set(nogos.Get());
713
nogos.Set(ptr.Get());
719
if (nogos.Get() != NULL)
723
aResult.Set(nogos.Get());
729
InternalReverseList(ptr, nogos);
730
nogos.Set(ptr.Get());
732
ptr.Set(aArguments.Get()->Copy(LispFalse));
733
ptr.Get()->Next().Set(nogos.Get());
734
nogos.Set(ptr.Get());
735
aResult.Set(LispSubList::New(nogos.Get()));
737
//aEnvironment.CurrentPrinter().Print(aResult, *aEnvironment.CurrentOutput());
742
InternalTrue(aEnvironment,aResult);
746
void LispLazyOr(LispEnvironment& aEnvironment, LispPtr& aResult,
754
LispIterator iter(Argument(aArguments,1));
757
InternalEval(aEnvironment, evaluated, *iter.Ptr());
758
if (IsTrue(aEnvironment, evaluated))
760
InternalTrue(aEnvironment,aResult);
763
else if (!IsFalse(aEnvironment, evaluated))
770
ptr.Set(evaluated.Get()->Copy(LispFalse));
771
ptr.Get()->Next().Set(nogos.Get());
772
nogos.Set(ptr.Get());
777
if (nogos.Get() != NULL)
781
aResult.Set(nogos.Get());
787
InternalReverseList(ptr, nogos);
788
nogos.Set(ptr.Get());
790
ptr.Set(aArguments.Get()->Copy(LispFalse));
791
ptr.Get()->Next().Set(nogos.Get());
792
nogos.Set(ptr.Get());
793
aResult.Set(LispSubList::New(nogos.Get()));
795
//aEnvironment.CurrentPrinter().Print(aResult, *aEnvironment.CurrentOutput());
799
InternalFalse(aEnvironment,aResult);
803
void LispEquals(LispEnvironment& aEnvironment, LispPtr& aResult,
808
InternalEval(aEnvironment, evaluated1, Argument(aArguments,1));
810
InternalEval(aEnvironment, evaluated2, Argument(aArguments,2));
812
InternalBoolean(aEnvironment,aResult,
813
InternalEquals(aEnvironment, evaluated1, evaluated2));
817
void LispWrite(LispEnvironment& aEnvironment, LispPtr& aResult,
821
LispInt nrArguments = InternalListLength(aArguments);
823
for (arg=1;arg<nrArguments;arg++)
825
InternalEval(aEnvironment, evaluated, Argument(aArguments,arg));
826
aEnvironment.CurrentPrinter().Print(evaluated,
827
*aEnvironment.CurrentOutput(),
830
InternalTrue(aEnvironment,aResult);
833
static void RepeatChar(LispEnvironment& aEnvironment, LispPtr& aResult,
834
LispPtr& aArguments, LispCharPtr aString)
836
LispInt nrArguments = InternalListLength(aArguments);
837
CHK(nrArguments == 1 || nrArguments == 2,KLispErrWrongNumberOfArgs);
839
if (nrArguments == 2)
842
InternalEval(aEnvironment, index, Argument(aArguments,1));
843
CHK_ARG(index.Get() != NULL, 1);
844
CHK_ARG(index.Get()->String() != NULL, 1);
845
nrTimes = InternalAsciiToInt(index.Get()->String()->String());
847
CHK_ARG(nrTimes>=0,1);
849
for (i=0;i<nrTimes;i++)
850
aEnvironment.CurrentOutput()->Write(aString);
851
InternalTrue(aEnvironment,aResult);
854
void LispSpace(LispEnvironment& aEnvironment, LispPtr& aResult,
857
RepeatChar(aEnvironment, aResult, aArguments, " ");
860
void LispNewLine(LispEnvironment& aEnvironment, LispPtr& aResult,
863
RepeatChar(aEnvironment, aResult, aArguments, "\n");
868
void LispWriteString(LispEnvironment& aEnvironment, LispPtr& aResult,
873
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
874
CHK_ARG(evaluated.Get()!= NULL,1);
875
LispStringPtr str = evaluated.Get()->String();
876
CHK_ARG(str != NULL,1);
877
CHK_ARG((*str)[0] == '\"',1);
878
CHK_ARG((*str)[str->NrItems()-2] == '\"',1);
881
LispInt nr=str->NrItems()-2;
882
//((*str)[i] != '\"')
885
aEnvironment.CurrentOutput()->PutChar((*str)[i]);
887
// pass last printed character to the current printer
888
aEnvironment.CurrentPrinter().RememberLastChar((*str)[nr-1]); // hacky hacky
889
InternalTrue(aEnvironment,aResult);
892
void LispProgBody(LispEnvironment& aEnvironment, LispPtr& aResult,
895
// Allow accessing previous locals.
896
LispLocalFrame frame(aEnvironment,LispFalse);
898
InternalTrue(aEnvironment,aResult);
900
// Evaluate args one by one.
901
LispInt nrArguments = InternalListLength(aArguments);
903
for (arg=1;arg<nrArguments;arg++)
905
InternalEval(aEnvironment, aResult, Argument(aArguments,arg));
909
static void InternalNewLocal(LispEnvironment& aEnvironment, LispPtr& aResult,
910
LispPtr& aArguments, LispBoolean aMacroMode)
912
LispInt nrArguments = InternalListLength(aArguments);
914
for (arg=1;arg<nrArguments;arg++)
916
LispStringPtr variable=NULL;
920
InternalEval(aEnvironment, result, Argument(aArguments,arg));
921
variable = result.Get()->String();
925
variable = Argument(aArguments,arg).Get()->String();
927
CHK_ARG(variable != NULL,arg);
928
aEnvironment.NewLocal(variable,NULL);
930
InternalTrue(aEnvironment,aResult);
933
void LispNewLocal(LispEnvironment& aEnvironment, LispPtr& aResult,
936
InternalNewLocal(aEnvironment, aResult,aArguments, LispFalse);
939
void LispMacroNewLocal(LispEnvironment& aEnvironment, LispPtr& aResult,
942
InternalNewLocal(aEnvironment, aResult,aArguments, LispTrue);
946
void LispWhile(LispEnvironment& aEnvironment, LispPtr& aResult,
951
LispPtr& arg1 = Argument(aArguments,1);
952
LispPtr& arg2 = Argument(aArguments,2);
955
InternalEval(aEnvironment, predicate, arg1);
957
while (IsTrue(aEnvironment,predicate))
960
InternalEval(aEnvironment, evaluated, arg2);
961
InternalEval(aEnvironment, predicate, arg1);
964
CHK_ARG(IsFalse(aEnvironment,predicate),1);
965
InternalTrue(aEnvironment,aResult);
971
static void MultiFix(LispEnvironment& aEnvironment, LispPtr& aResult,
972
LispPtr& aArguments, LispOperators& aOps)
977
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
978
LispStringPtr orig = Argument(aArguments,1).Get()->String();
979
CHK_ARG(orig != NULL, 1);
982
InternalEval(aEnvironment, precedence, Argument(aArguments,2));
983
CHK_ARG(precedence.Get()->String() != NULL, 2);
984
LispInt prec = InternalAsciiToInt(precedence.Get()->String()->String());
985
CHK_ARG(prec <= KMaxPrecedence, 2);
986
aOps.SetOperator(prec,SymbolName(aEnvironment,orig->String()));
987
InternalTrue(aEnvironment,aResult);
990
void LispInFix(LispEnvironment& aEnvironment, LispPtr& aResult,
993
MultiFix(aEnvironment, aResult, aArguments, aEnvironment.InFix());
997
static void SingleFix(LispInt aPrecedence, LispEnvironment& aEnvironment, LispPtr& aResult,
998
LispPtr& aArguments, LispOperators& aOps)
1003
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
1004
LispStringPtr orig = Argument(aArguments,1).Get()->String();
1005
CHK_ARG(orig != NULL, 1);
1006
aOps.SetOperator(aPrecedence,SymbolName(aEnvironment,orig->String()));
1007
InternalTrue(aEnvironment,aResult);
1009
void LispPreFix(LispEnvironment& aEnvironment, LispPtr& aResult,
1010
LispPtr& aArguments)
1012
LispInt nrArguments = InternalListLength(aArguments);
1013
if (nrArguments == 2)
1015
SingleFix(0, aEnvironment, aResult,aArguments, aEnvironment.PreFix());
1019
MultiFix(aEnvironment, aResult, aArguments, aEnvironment.PreFix());
1022
void LispPostFix(LispEnvironment& aEnvironment, LispPtr& aResult,
1023
LispPtr& aArguments)
1025
LispInt nrArguments = InternalListLength(aArguments);
1026
if (nrArguments == 2)
1028
SingleFix(0, aEnvironment, aResult,aArguments, aEnvironment.PostFix());
1032
MultiFix(aEnvironment, aResult, aArguments, aEnvironment.PostFix());
1034
// SingleFix(0, aEnvironment, aResult,aArguments, aEnvironment.PostFix());
1036
void LispBodied(LispEnvironment& aEnvironment, LispPtr& aResult,
1037
LispPtr& aArguments)
1039
MultiFix(aEnvironment, aResult, aArguments, aEnvironment.Bodied());
1043
void LispAtomize(LispEnvironment& aEnvironment, LispPtr& aResult,
1044
LispPtr& aArguments)
1049
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1052
CHK_ARG(evaluated.Get() != NULL, 1);
1053
LispStringPtr orig = evaluated.Get()->String();
1054
CHK_ARG(orig != NULL, 1);
1055
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUpUnStringify(orig->String())));
1059
void LispStringify(LispEnvironment& aEnvironment, LispPtr& aResult,
1060
LispPtr& aArguments)
1065
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1068
CHK_ARG(evaluated.Get() != NULL, 1);
1069
LispStringPtr orig = evaluated.Get()->String();
1070
CHK_ARG(orig != NULL, 1);
1072
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUpStringify(orig->String())));
1078
void LispLoad(LispEnvironment& aEnvironment, LispPtr& aResult,
1079
LispPtr& aArguments)
1082
CHK(aEnvironment.iSecure == 0, KLispErrSecurityBreach);
1085
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1088
CHK_ARG(evaluated.Get() != NULL, 1);
1089
LispStringPtr orig = evaluated.Get()->String();
1090
CHK_ARG(orig != NULL, 1);
1092
InternalLoad(aEnvironment,orig);
1093
InternalTrue(aEnvironment,aResult);
1097
static void InternalRuleBase(LispEnvironment& aEnvironment, LispPtr& aResult,
1098
LispPtr& aArguments, LispBoolean aMacroMode,
1105
LispStringPtr orig=NULL;
1110
InternalEval(aEnvironment, result, Argument(aArguments,1));
1111
orig = result.Get()->String();
1112
CHK_ARG(orig != NULL, 1);
1113
InternalEval(aEnvironment, args, Argument(aArguments,2));
1117
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
1118
orig = Argument(aArguments,1).Get()->String();
1119
CHK_ARG(orig != NULL, 1);
1120
args.Set(Argument(aArguments,2).Get());
1126
// Finally define the rule base
1127
aEnvironment.DeclareRuleBase(SymbolName(aEnvironment,orig->String()),
1128
args.Get()->SubList()->Get()->Next(),aListed);
1131
InternalTrue(aEnvironment,aResult);
1134
void LispRuleBase(LispEnvironment& aEnvironment, LispPtr& aResult,
1135
LispPtr& aArguments)
1137
InternalRuleBase(aEnvironment, aResult, aArguments, LispFalse,LispFalse);
1139
void LispMacroRuleBase(LispEnvironment& aEnvironment, LispPtr& aResult,
1140
LispPtr& aArguments)
1142
InternalRuleBase(aEnvironment, aResult, aArguments, LispTrue,LispFalse);
1145
void LispRuleBaseListed(LispEnvironment& aEnvironment, LispPtr& aResult,
1146
LispPtr& aArguments)
1148
InternalRuleBase(aEnvironment, aResult, aArguments, LispFalse,LispTrue);
1150
void LispMacroRuleBaseListed(LispEnvironment& aEnvironment, LispPtr& aResult,
1151
LispPtr& aArguments)
1153
InternalRuleBase(aEnvironment, aResult, aArguments, LispTrue,LispTrue);
1157
void LispHoldArg(LispEnvironment& aEnvironment, LispPtr& aResult,
1158
LispPtr& aArguments)
1163
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
1164
LispStringPtr orig = Argument(aArguments,1).Get()->String();
1165
CHK_ARG(orig != NULL, 1);
1168
LispStringPtr tohold = Argument(aArguments,2).Get()->String();
1169
CHK_ARG(tohold != NULL, 2);
1170
aEnvironment.HoldArgument(SymbolName(aEnvironment,orig->String()), tohold);
1172
InternalTrue(aEnvironment,aResult);
1175
static void InternalNewRule(LispEnvironment& aEnvironment, LispPtr& aResult,
1176
LispPtr& aArguments, LispBoolean aMacroMode)
1187
LispStringPtr orig=NULL;
1193
InternalEval(aEnvironment, result, Argument(aArguments,1));
1194
CHK_ARG(result.Get() != NULL, 1);
1195
orig = result.Get()->String();
1196
CHK_ARG(orig != NULL, 1);
1198
InternalEval(aEnvironment, ar, Argument(aArguments,2));
1199
InternalEval(aEnvironment, pr, Argument(aArguments,3));
1200
InternalEval(aEnvironment, predicate, Argument(aArguments,4));
1201
InternalEval(aEnvironment, body, Argument(aArguments,5));
1205
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
1206
orig = Argument(aArguments,1).Get()->String();
1207
CHK_ARG(orig != NULL, 1);
1208
ar.Set(Argument(aArguments,2).Get());
1209
pr.Set(Argument(aArguments,3).Get());
1210
predicate.Set(Argument(aArguments,4).Get());
1211
body.Set(Argument(aArguments,5).Get());
1215
CHK_ARG(ar.Get() != NULL, 2);
1216
CHK_ARG(ar.Get()->String() != NULL, 2);
1217
arity = InternalAsciiToInt(ar.Get()->String()->String());
1220
CHK_ARG(pr.Get() != NULL, 3);
1221
CHK_ARG(pr.Get()->String() != NULL, 3);
1222
precedence = InternalAsciiToInt(pr.Get()->String()->String());
1224
// Finally define the rule base
1225
aEnvironment.DefineRule(SymbolName(aEnvironment,orig->String()),
1232
InternalTrue(aEnvironment,aResult);
1235
void LispNewRule(LispEnvironment& aEnvironment, LispPtr& aResult,
1236
LispPtr& aArguments)
1238
InternalNewRule(aEnvironment, aResult,aArguments, LispFalse);
1241
void LispMacroNewRule(LispEnvironment& aEnvironment, LispPtr& aResult,
1242
LispPtr& aArguments)
1244
InternalNewRule(aEnvironment, aResult,aArguments, LispTrue);
1248
void LispUnFence(LispEnvironment& aEnvironment, LispPtr& aResult,
1249
LispPtr& aArguments)
1254
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
1255
LispStringPtr orig = Argument(aArguments,1).Get()->String();
1256
CHK_ARG(orig != NULL, 1);
1259
CHK_ARG(Argument(aArguments,2).Get() != NULL, 2);
1260
CHK_ARG(Argument(aArguments,2).Get()->String() != NULL, 2);
1261
LispInt arity = InternalAsciiToInt(Argument(aArguments,2).Get()->String()->String());
1263
aEnvironment.UnFenceRule(SymbolName(aEnvironment,orig->String()),
1267
InternalTrue(aEnvironment,aResult);
1272
void LispIsFunction(LispEnvironment& aEnvironment,LispPtr& aResult,
1273
LispPtr& aArguments)
1277
InternalEval(aEnvironment, result, Argument(aArguments,1));
1278
InternalBoolean(aEnvironment,aResult,
1279
result.Get()->SubList()!=NULL);
1281
void LispIsAtom(LispEnvironment& aEnvironment,LispPtr& aResult,
1282
LispPtr& aArguments)
1286
InternalEval(aEnvironment, result, Argument(aArguments,1));
1287
InternalBoolean(aEnvironment,aResult,
1288
result.Get()->String()!=NULL);
1290
void LispIsNumber(LispEnvironment& aEnvironment,LispPtr& aResult,
1291
LispPtr& aArguments)
1295
InternalEval(aEnvironment, result, Argument(aArguments,1));
1296
if (result.Get()->String() == NULL)
1298
InternalFalse(aEnvironment,aResult);
1302
InternalBoolean(aEnvironment,aResult,
1303
IsNumber(result.Get()->String()->String(),LispTrue));
1307
void LispIsInteger(LispEnvironment& aEnvironment,LispPtr& aResult,
1308
LispPtr& aArguments)
1312
InternalEval(aEnvironment, result, Argument(aArguments,1));
1313
if (result.Get()->String() == NULL)
1315
InternalFalse(aEnvironment,aResult);
1319
InternalBoolean(aEnvironment,aResult,
1320
IsNumber(result.Get()->String()->String(),LispFalse));
1325
void LispIsList(LispEnvironment& aEnvironment,LispPtr& aResult,
1326
LispPtr& aArguments)
1330
InternalEval(aEnvironment, result, Argument(aArguments,1));
1331
InternalBoolean(aEnvironment,aResult,InternalIsList(result));
1335
void LispIsString(LispEnvironment& aEnvironment,LispPtr& aResult,
1336
LispPtr& aArguments)
1340
InternalEval(aEnvironment, result, Argument(aArguments,1));
1341
InternalBoolean(aEnvironment,aResult,
1342
InternalIsString(result.Get()->String()));
1345
void LispIsBound(LispEnvironment& aEnvironment,LispPtr& aResult,
1346
LispPtr& aArguments)
1349
LispStringPtr str = Argument(aArguments,1).Get()->String();
1353
aEnvironment.GetVariable(str,val);
1356
InternalTrue(aEnvironment,aResult);
1360
InternalFalse(aEnvironment,aResult);
1365
void LispIf(LispEnvironment& aEnvironment, LispPtr& aResult,
1366
LispPtr& aArguments)
1368
LispInt nrArguments = InternalListLength(aArguments);
1369
CHK(nrArguments == 3 || nrArguments == 4,KLispErrWrongNumberOfArgs);
1372
InternalEval(aEnvironment, predicate, Argument(aArguments,1));
1374
if (IsTrue(aEnvironment,predicate))
1376
InternalEval(aEnvironment, aResult, Argument(aArguments,2));
1380
CHK_ARG(IsFalse(aEnvironment,predicate),1);
1381
if (nrArguments == 4)
1383
InternalEval(aEnvironment, aResult, Argument(aArguments,3));
1387
InternalFalse(aEnvironment,aResult);
1394
void LispRetract(LispEnvironment& aEnvironment, LispPtr& aResult,
1395
LispPtr& aArguments)
1401
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1403
CHK_ARG(evaluated.Get() != NULL, 1);
1404
LispStringPtr orig = evaluated.Get()->String();
1405
CHK_ARG(orig != NULL, 1);
1406
LispStringPtr oper = SymbolName(aEnvironment,orig->String());
1407
//TODO remove InternalUnstringify(oper, orig);
1410
InternalEval(aEnvironment, arity, Argument(aArguments,2));
1411
CHK_ARG(arity.Get()->String() != NULL, 2);
1412
LispInt ar = InternalAsciiToInt(arity.Get()->String()->String());
1413
aEnvironment.Retract(oper, ar);
1414
InternalTrue(aEnvironment,aResult);
1418
void LispPrecision(LispEnvironment& aEnvironment, LispPtr& aResult,
1419
LispPtr& aArguments)
1424
InternalEval(aEnvironment, index, Argument(aArguments,1));
1425
CHK_ARG(index.Get() != NULL, 1);
1426
CHK_ARG(index.Get()->String() != NULL, 1);
1428
LispInt ind = InternalAsciiToInt(index.Get()->String()->String());
1430
aEnvironment.SetPrecision(ind);
1431
InternalTrue(aEnvironment,aResult);
1436
void LispDefaultDirectory(LispEnvironment& aEnvironment, LispPtr& aResult,
1437
LispPtr& aArguments)
1442
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1445
CHK_ARG(evaluated.Get() != NULL, 1);
1446
LispStringPtr orig = evaluated.Get()->String();
1447
CHK_ARG(orig != NULL, 1);
1449
InternalUnstringify(oper, orig);
1450
aEnvironment.iInputDirectories.Append(NEW LispString(oper.String()));
1451
InternalTrue(aEnvironment,aResult);
1455
void LispFromFile(LispEnvironment& aEnvironment, LispPtr& aResult,
1456
LispPtr& aArguments)
1460
CHK(aEnvironment.iSecure == 0, KLispErrSecurityBreach);
1463
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1466
CHK_ARG(evaluated.Get() != NULL, 1);
1467
LispStringPtr orig = evaluated.Get()->String();
1468
CHK_ARG(orig != NULL, 1);
1470
LispStringPtr contents = aEnvironment.FindCachedFile(orig->String());
1471
LispStringPtr hashedname = aEnvironment.HashTable().LookUpUnStringify(orig->String());
1472
//TODO remove? LispRamFile* ramFile=aEnvironment.iRamDisk.LookUp(hashedname);
1474
InputStatus oldstatus = aEnvironment.iInputStatus;
1475
aEnvironment.iInputStatus.SetTo(hashedname->String());
1477
//TODO remove? if (ramFile != NULL)
1480
StringInput newInput(*contents,aEnvironment.iInputStatus);
1481
LispLocalInput localInput(aEnvironment, &newInput);
1483
// Evaluate the body
1484
InternalEval(aEnvironment, aResult, Argument(aArguments,2));
1489
//TODO make the file api platform independent!!!!
1491
LispLocalFile localFP(aEnvironment, hashedname->String(),LispTrue,
1492
aEnvironment.iInputDirectories);
1493
CHK(localFP.iOpened != 0, KLispErrFileNotFound);
1494
FILEINPUT newInput(localFP,aEnvironment.iInputStatus);
1495
LispLocalInput localInput(aEnvironment, &newInput);
1497
// Evaluate the body
1498
InternalEval(aEnvironment, aResult, Argument(aArguments,2));
1500
aEnvironment.iInputStatus.RestoreFrom(oldstatus);
1505
void LispFromString(LispEnvironment& aEnvironment, LispPtr& aResult,
1506
LispPtr& aArguments)
1511
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1514
CHK_ARG(evaluated.Get() != NULL, 1);
1515
LispStringPtr orig = evaluated.Get()->String();
1516
CHK_ARG(orig != NULL, 1);
1518
InternalUnstringify(oper, orig);
1520
InputStatus oldstatus = aEnvironment.iInputStatus;
1521
aEnvironment.iInputStatus.SetTo("String");
1522
StringInput newInput(oper,aEnvironment.iInputStatus);
1523
LispLocalInput localInput(aEnvironment, &newInput);
1525
// Evaluate the body
1526
InternalEval(aEnvironment, aResult, Argument(aArguments,2));
1527
aEnvironment.iInputStatus.RestoreFrom(oldstatus);
1533
void LispRead(LispEnvironment& aEnvironment, LispPtr& aResult,
1534
LispPtr& aArguments)
1536
LispTokenizer &tok = *aEnvironment.iCurrentTokenizer;
1537
InfixParser parser(tok,
1538
*aEnvironment.CurrentInput(),
1539
aEnvironment.HashTable(),
1540
aEnvironment.PreFix(),
1541
aEnvironment.InFix(),
1542
aEnvironment.PostFix(),
1543
aEnvironment.Bodied());
1545
parser.Parse(aResult,aEnvironment);
1549
void LispReadToken(LispEnvironment& aEnvironment, LispPtr& aResult,
1550
LispPtr& aArguments)
1552
LispTokenizer &tok = *aEnvironment.iCurrentTokenizer;
1553
LispStringPtr result;
1554
result = tok.NextToken(*aEnvironment.CurrentInput(),
1555
aEnvironment.HashTable());
1557
if (result->String()[0] == '\0')
1559
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp("EndOfFile")));
1562
aResult.Set(LispAtom::New(result));
1566
void LispToFile(LispEnvironment& aEnvironment, LispPtr& aResult,
1567
LispPtr& aArguments)
1570
CHK(aEnvironment.iSecure == 0, KLispErrSecurityBreach);
1573
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1576
CHK_ARG(evaluated.Get() != NULL, 1);
1577
LispStringPtr orig = evaluated.Get()->String();
1578
CHK_ARG(orig != NULL, 1);
1580
InternalUnstringify(oper, orig);
1582
//TODO make the file api platform independent!!!!
1583
// Open file for writing
1584
LispLocalFile localFP(aEnvironment, oper.String(),LispFalse,
1585
aEnvironment.iInputDirectories);
1586
CHK(localFP.iOpened != 0, KLispErrFileNotFound);
1587
StdFileOutput newOutput(localFP);
1588
LispLocalOutput localOutput(aEnvironment, &newOutput);
1590
// Evaluate the body
1591
InternalEval(aEnvironment, aResult, Argument(aArguments,2));
1598
void LispCheck(LispEnvironment& aEnvironment,LispPtr& aResult,
1599
LispPtr& aArguments)
1603
InternalEval(aEnvironment, aResult, Argument(aArguments,1));
1604
if (!IsTrue(aEnvironment,aResult))
1607
InternalEval(aEnvironment, evaluated, Argument(aArguments,2));
1608
CHK_ISSTRING(evaluated,2);
1609
aEnvironment.SetUserError(evaluated.Get()->String()->String());
1610
CHK(0,KLispErrUser);
1616
void LispSystemCall(LispEnvironment& aEnvironment,LispPtr& aResult,
1617
LispPtr& aArguments)
1620
CHK(aEnvironment.iSecure == 0, KLispErrSecurityBreach);
1623
InternalEval(aEnvironment, result, Argument(aArguments,1));
1624
CHK_ISSTRING(result,1);
1627
InternalUnstringify(command, result.Get()->String());
1629
SystemCall(command.String());
1630
InternalTrue(aEnvironment,aResult);
1632
InternalFalse(aEnvironment,aResult);
1641
void LispFastPi(LispEnvironment& aEnvironment, LispPtr& aResult,
1642
LispPtr& aArguments)
1645
aResult.Set(LispAtom::New(PlatPi(aEnvironment.HashTable(),
1646
aEnvironment.Precision())));
1661
void LispMaxEvalDepth(LispEnvironment& aEnvironment, LispPtr& aResult,
1662
LispPtr& aArguments)
1667
InternalEval(aEnvironment, index, Argument(aArguments,1));
1668
CHK_ARG(index.Get() != NULL, 1);
1669
CHK_ARG(index.Get()->String() != NULL, 1);
1671
LispInt ind = InternalAsciiToInt(index.Get()->String()->String());
1672
aEnvironment.iMaxEvalDepth = ind;
1673
InternalTrue(aEnvironment,aResult);
1677
void LispDefLoad(LispEnvironment& aEnvironment, LispPtr& aResult,
1678
LispPtr& aArguments)
1681
CHK(aEnvironment.iSecure == 0, KLispErrSecurityBreach);
1684
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1687
CHK_ARG(evaluated.Get() != NULL, 1);
1688
LispStringPtr orig = evaluated.Get()->String();
1689
CHK_ARG(orig != NULL, 1);
1691
LoadDefFile(aEnvironment, orig);
1692
InternalTrue(aEnvironment,aResult);
1695
void LispUse(LispEnvironment& aEnvironment, LispPtr& aResult,
1696
LispPtr& aArguments)
1699
CHK(aEnvironment.iSecure == 0, KLispErrSecurityBreach);
1702
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1705
CHK_ARG(evaluated.Get() != NULL, 1);
1706
LispStringPtr orig = evaluated.Get()->String();
1707
CHK_ARG(orig != NULL, 1);
1709
InternalUse(aEnvironment,orig);
1710
InternalTrue(aEnvironment,aResult);
1713
void LispRightAssociative(LispEnvironment& aEnvironment, LispPtr& aResult,
1714
LispPtr& aArguments)
1718
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
1719
LispStringPtr orig = Argument(aArguments,1).Get()->String();
1720
CHK_ARG(orig != NULL, 1);
1721
aEnvironment.InFix().SetRightAssociative(SymbolName(aEnvironment,orig->String()));
1722
InternalTrue(aEnvironment,aResult);
1726
void LispLeftPrecedence(LispEnvironment& aEnvironment, LispPtr& aResult,
1727
LispPtr& aArguments)
1731
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
1732
LispStringPtr orig = Argument(aArguments,1).Get()->String();
1733
CHK_ARG(orig != NULL, 1);
1736
InternalEval(aEnvironment, index, Argument(aArguments,2));
1737
CHK_ARG(index.Get() != NULL, 2);
1738
CHK_ARG(index.Get()->String() != NULL, 2);
1739
LispInt ind = InternalAsciiToInt(index.Get()->String()->String());
1741
aEnvironment.InFix().SetLeftPrecedence(SymbolName(aEnvironment,orig->String()),ind);
1742
InternalTrue(aEnvironment,aResult);
1746
void LispRightPrecedence(LispEnvironment& aEnvironment, LispPtr& aResult,
1747
LispPtr& aArguments)
1751
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
1752
LispStringPtr orig = Argument(aArguments,1).Get()->String();
1753
CHK_ARG(orig != NULL, 1);
1756
InternalEval(aEnvironment, index, Argument(aArguments,2));
1757
CHK_ARG(index.Get() != NULL, 2);
1758
CHK_ARG(index.Get()->String() != NULL, 2);
1759
LispInt ind = InternalAsciiToInt(index.Get()->String()->String());
1761
aEnvironment.InFix().SetRightPrecedence(SymbolName(aEnvironment,orig->String()),ind);
1762
InternalTrue(aEnvironment,aResult);
1780
static LispInFixOperator* OperatorInfo(LispEnvironment& aEnvironment,
1781
LispPtr& aArguments,
1782
LispOperators & aOperators)
1786
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
1789
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1791
LispStringPtr orig = evaluated.Get()->String();
1792
CHK_ARG(orig != NULL, 1);
1795
LispInFixOperator* op = aOperators.LookUp(
1796
SymbolName(aEnvironment,orig->String()));
1801
void LispIsInFix(LispEnvironment& aEnvironment, LispPtr& aResult,
1802
LispPtr& aArguments)
1805
LispInFixOperator* op = OperatorInfo(aEnvironment,
1807
aEnvironment.InFix());
1809
InternalTrue( aEnvironment, aResult);
1811
InternalFalse(aEnvironment, aResult);
1814
void LispIsBodied(LispEnvironment& aEnvironment, LispPtr& aResult,
1815
LispPtr& aArguments)
1818
LispInFixOperator* op = OperatorInfo(aEnvironment,
1820
aEnvironment.Bodied());
1822
InternalTrue( aEnvironment, aResult);
1824
InternalFalse(aEnvironment, aResult);
1827
void LispGetPrecedence(LispEnvironment& aEnvironment, LispPtr& aResult,
1828
LispPtr& aArguments)
1831
LispInFixOperator* op = OperatorInfo(aEnvironment,
1833
aEnvironment.InFix());
1834
if (op == NULL) { // also need to check for a postfix or prefix operator
1835
op = OperatorInfo(aEnvironment,
1837
aEnvironment.PreFix());
1839
op = OperatorInfo(aEnvironment,
1841
aEnvironment.PostFix());
1842
if (op == NULL) { // or maybe it's a bodied function
1843
op = OperatorInfo(aEnvironment,
1845
aEnvironment.Bodied());
1846
CHK(op!=NULL, KLispErrIsNotInFix);
1851
InternalIntToAscii(buf, op->iPrecedence);
1852
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(buf)));
1856
void LispGetLeftPrecedence(LispEnvironment& aEnvironment, LispPtr& aResult,
1857
LispPtr& aArguments)
1860
LispInFixOperator* op = OperatorInfo(aEnvironment,
1862
aEnvironment.InFix());
1863
if (op == NULL) { // infix and postfix operators have left precedence
1864
op = OperatorInfo(aEnvironment,
1866
aEnvironment.PostFix());
1867
CHK(op!=NULL, KLispErrIsNotInFix);
1871
InternalIntToAscii(buf, op->iLeftPrecedence);
1872
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(buf)));
1874
void LispGetRightPrecedence(LispEnvironment& aEnvironment, LispPtr& aResult,
1875
LispPtr& aArguments)
1878
LispInFixOperator* op = OperatorInfo(aEnvironment,
1880
aEnvironment.InFix());
1881
if (op == NULL) { // bodied, infix and prefix operators have right precedence
1882
op = OperatorInfo(aEnvironment,
1884
aEnvironment.PreFix());
1885
if (op == NULL) { // or maybe it's a bodied function
1886
op = OperatorInfo(aEnvironment,
1888
aEnvironment.Bodied());
1889
CHK(op!=NULL, KLispErrIsNotInFix);
1894
InternalIntToAscii(buf, op->iRightPrecedence);
1895
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(buf)));
1900
void LispIsPreFix(LispEnvironment& aEnvironment, LispPtr& aResult,
1901
LispPtr& aArguments)
1904
LispInFixOperator* op = OperatorInfo(aEnvironment,
1906
aEnvironment.PreFix());
1908
InternalTrue( aEnvironment, aResult);
1910
InternalFalse(aEnvironment, aResult);
1913
void LispIsPostFix(LispEnvironment& aEnvironment, LispPtr& aResult,
1914
LispPtr& aArguments)
1917
LispInFixOperator* op = OperatorInfo(aEnvironment,
1919
aEnvironment.PostFix());
1921
InternalTrue( aEnvironment, aResult);
1923
InternalFalse(aEnvironment, aResult);
1926
void LispGetPrecision(LispEnvironment& aEnvironment, LispPtr& aResult,
1927
LispPtr& aArguments)
1931
InternalIntToAscii(buf, aEnvironment.Precision());
1932
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(buf)));
1937
void LispToString(LispEnvironment& aEnvironment, LispPtr& aResult,
1938
LispPtr& aArguments)
1943
StringOutput newOutput(oper);
1945
LispLocalOutput localOutput(aEnvironment, &newOutput);
1947
// Evaluate the body
1948
InternalEval(aEnvironment, aResult, Argument(aArguments,1));
1951
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUpStringify(oper.String())));
1954
void LispSecure(LispEnvironment& aEnvironment,LispPtr& aResult,
1955
LispPtr& aArguments)
1958
LispSecureFrame security(aEnvironment);
1959
InternalEval(aEnvironment, aResult, Argument(aArguments,1));
1963
void LispFindFile(LispEnvironment& aEnvironment,LispPtr& aResult,
1964
LispPtr& aArguments)
1969
CHK(aEnvironment.iSecure == 0, KLispErrSecurityBreach);
1972
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1975
CHK_ARG(evaluated.Get() != NULL, 1);
1976
LispStringPtr orig = evaluated.Get()->String();
1977
CHK_ARG(orig != NULL, 1);
1979
InternalUnstringify(oper, orig);
1981
LispChar filename[1024];//TODO FIXME
1982
InternalFindFile(oper.String(), aEnvironment.iInputDirectories,
1984
LispString res(filename,1);
1985
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUpStringify(res.String())));
1989
void LispIsGeneric(LispEnvironment& aEnvironment,LispPtr& aResult,
1990
LispPtr& aArguments)
1994
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
1996
if (evaluated.Get()->Generic() != NULL)
1997
InternalTrue( aEnvironment, aResult);
1999
InternalFalse(aEnvironment, aResult);
2002
void LispGenericTypeName(LispEnvironment& aEnvironment,LispPtr& aResult,
2003
LispPtr& aArguments)
2007
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
2009
CHK_ARG(evaluated.Get()->Generic() != NULL,1);
2011
LispCharPtr name = evaluated.Get()->Generic()->TypeName();
2012
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(name)));
2015
void GenArrayCreate(LispEnvironment& aEnvironment,LispPtr& aResult,
2016
LispPtr& aArguments)
2021
InternalEval(aEnvironment, sizearg, Argument(aArguments,1));
2023
CHK_ARG(sizearg.Get() != NULL, 1);
2024
CHK_ARG(sizearg.Get()->String() != NULL, 1);
2026
LispInt size = InternalAsciiToInt(sizearg.Get()->String()->String());
2029
InternalEval(aEnvironment, initarg, Argument(aArguments,2));
2031
ArrayClass *array = NEW ArrayClass(size,initarg.Get());
2032
aResult.Set(LispGenericClass::New(array));
2035
void GenArraySize(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2039
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
2041
GenericClass *gen = evaluated.Get()->Generic();
2042
CHK_ARG(gen != NULL,1);
2043
CHK_ARG(StrEqual(gen->TypeName(),"\"Array\""),1);
2044
LispInt size=((ArrayClass*)gen)->Size();
2046
InternalIntToAscii(s,size);
2047
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(s)));
2050
void GenArrayGet(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2054
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
2056
GenericClass *gen = evaluated.Get()->Generic();
2057
CHK_ARG(gen != NULL,1);
2058
CHK_ARG(StrEqual(gen->TypeName(),"\"Array\""),1);
2061
InternalEval(aEnvironment, sizearg, Argument(aArguments,2));
2063
CHK_ARG(sizearg.Get() != NULL, 2);
2064
CHK_ARG(sizearg.Get()->String() != NULL, 2);
2066
LispInt size = InternalAsciiToInt(sizearg.Get()->String()->String());
2069
CHK_ARG(size>0 && size<=((ArrayClass*)gen)->Size(),2);
2070
LispObject* object = ((ArrayClass*)gen)->GetElement(size);
2072
aResult.Set(object->Copy(LispFalse));
2076
void GenArraySet(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2081
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
2083
GenericClass *gen = evaluated.Get()->Generic();
2084
CHK_ARG(gen != NULL,1);
2085
CHK_ARG(StrEqual(gen->TypeName(),"\"Array\""),1);
2088
InternalEval(aEnvironment, sizearg, Argument(aArguments,2));
2090
CHK_ARG(sizearg.Get() != NULL, 2);
2091
CHK_ARG(sizearg.Get()->String() != NULL, 2);
2093
LispInt size = InternalAsciiToInt(sizearg.Get()->String()->String());
2094
CHK_ARG(size>0 && size<=((ArrayClass*)gen)->Size(),2);
2097
InternalEval(aEnvironment, obj, Argument(aArguments,3));
2098
((ArrayClass*)gen)->SetElement(size,obj.Get());
2099
InternalTrue( aEnvironment, aResult);
2102
void LispTrace(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2105
LispLocalEvaluator local(aEnvironment,NEW TracedEvaluator);
2106
aEnvironment.iDebugger->Start();
2107
InternalEval(aEnvironment, aResult, Argument(aArguments,1));
2108
aEnvironment.iDebugger->Finish();
2111
void LispTraceStack(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2114
LispLocalEvaluator local(aEnvironment,NEW TracedStackEvaluator);
2115
InternalEval(aEnvironment, aResult, Argument(aArguments,1));
2119
void LispReadLisp(LispEnvironment& aEnvironment, LispPtr& aResult,
2120
LispPtr& aArguments)
2122
LispTokenizer &tok = *aEnvironment.iCurrentTokenizer;
2123
LispParser parser(tok,
2124
*aEnvironment.CurrentInput(),
2125
aEnvironment.HashTable());
2127
parser.Parse(aResult,aEnvironment);
2131
void LispTraceRule(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2134
LispPtr *ptr = aArguments.Get()->Next().Get()->SubList();
2135
LispUserFunction* userfunc=NULL;
2137
userfunc = GetUserFunction(aEnvironment,ptr);
2138
LispLocalTrace trace(userfunc);
2139
InternalEval(aEnvironment, aResult, Argument(aArguments,2));
2142
void LispType(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2146
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
2147
LispPtr* subList = evaluated.Get()->SubList();
2148
LispObject* head = NULL;
2153
head = subList->Get();
2154
if (!head->String())
2156
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUpStringify(head->String()->String())));
2160
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp("\"\"")));
2166
void LispStringMid(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2170
InternalEval(aEnvironment, evaluated, Argument(aArguments,3));
2171
CHK_ISSTRING(evaluated,3);
2172
LispStringPtr orig = evaluated.Get()->String();
2175
InternalEval(aEnvironment, index, Argument(aArguments,1));
2176
CHK_ARG(index.Get() != NULL, 1);
2177
CHK_ARG(index.Get()->String() != NULL, 1);
2178
LispInt from = InternalAsciiToInt(index.Get()->String()->String());
2181
InternalEval(aEnvironment, index, Argument(aArguments,2));
2182
CHK_ARG(index.Get() != NULL, 2);
2183
CHK_ARG(index.Get()->String() != NULL, 2);
2184
LispInt count = InternalAsciiToInt(index.Get()->String()->String());
2191
CHK(from+count<orig->NrItems()-1, KLispErrInvalidArg);
2192
for (i=from;i<from+count;i++)
2193
str.Append((*orig)[i]);
2196
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(str.String())));
2200
void LispSetStringMid(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2204
InternalEval(aEnvironment, evaluated, Argument(aArguments,3));
2205
CHK_ISSTRING(evaluated,3);
2206
LispStringPtr orig = evaluated.Get()->String();
2208
InternalEval(aEnvironment, index, Argument(aArguments,1));
2209
CHK_ARG(index.Get() != NULL, 1);
2210
CHK_ARG(index.Get()->String() != NULL, 1);
2211
LispInt from = InternalAsciiToInt(index.Get()->String()->String());
2216
InternalEval(aEnvironment, ev2, Argument(aArguments,2));
2217
CHK_ISSTRING(ev2,2);
2218
LispStringPtr replace = ev2.Get()->String();
2220
LispString str(orig->String());
2222
LispInt count = replace->NrItems();
2223
CHK(from+count-3<orig->NrItems()-1, KLispErrInvalidArg);
2225
for (i=0;i<count-3;i++)
2226
str[i+from] = (*replace)[i+1];
2227
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(str.String())));
2232
void LispFindFunction(LispEnvironment& aEnvironment,LispPtr& aResult,
2233
LispPtr& aArguments)
2236
CHK(aEnvironment.iSecure == 0, KLispErrSecurityBreach);
2239
InternalEval(aEnvironment, evaluated, Argument(aArguments,1));
2242
CHK_ARG(evaluated.Get() != NULL, 1);
2243
LispStringPtr orig = evaluated.Get()->String();
2244
CHK_ARG(orig != NULL, 1);
2246
InternalUnstringify(oper, orig);
2248
LispMultiUserFunction* multiUserFunc =
2249
aEnvironment.MultiUserFunction(aEnvironment.HashTable().LookUp(oper.String()));
2250
if (multiUserFunc != NULL)
2252
LispDefFile* def = multiUserFunc->iFileToOpen;
2255
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp(def->iFileName()->String())));
2259
aResult.Set(LispAtom::New(aEnvironment.HashTable().LookUp("\"\"")));
2281
void GenPatternCreate(LispEnvironment& aEnvironment,LispPtr& aResult,
2282
LispPtr& aArguments)
2286
InternalEval(aEnvironment, pattern, Argument(aArguments,1));
2287
LispPtr postpredicate;
2288
InternalEval(aEnvironment, postpredicate, Argument(aArguments,2));
2290
LispIterator iter(pattern);
2291
CHK_ARG(iter() != NULL,1);
2292
CHK_ARG(iter()->SubList() != NULL,1);
2294
CHK_ARG(iter() != NULL,1);
2297
LispPtr *ptr = iter.Ptr();
2300
YacasPatternPredicateBase* matcher =
2301
NEW YacasPatternPredicateBase(aEnvironment, *ptr,postpredicate);
2302
PatternClass *p = NEW PatternClass(matcher);
2303
aResult.Set(LispGenericClass::New(p));
2305
void GenPatternMatches(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2309
InternalEval(aEnvironment, pattern, Argument(aArguments,1));
2310
GenericClass *gen = pattern.Get()->Generic();
2311
CHK_ARG(gen != NULL,1);
2312
CHK_ARG(StrEqual(gen->TypeName(),"\"Pattern\""),1);
2315
InternalEval(aEnvironment, list, Argument(aArguments,2));
2317
PatternClass *patclass = (PatternClass*)gen;
2319
LispIterator iter(list);
2320
CHK_ARG(iter() != NULL,2);
2321
CHK_ARG(iter()->SubList() != NULL,2);
2323
CHK_ARG(iter() != NULL,2);
2326
LispPtr *ptr = iter.Ptr();
2327
CHK_ARG(ptr != NULL,2);
2328
LispBoolean matches = patclass->Matches(aEnvironment,*ptr);
2329
InternalBoolean(aEnvironment,aResult,matches);
2332
void LispRuleBaseDefined(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2336
InternalEval(aEnvironment, name, Argument(aArguments,1));
2337
LispStringPtr orig = name.Get()->String();
2338
CHK_ARG(orig != NULL, 1);
2340
InternalUnstringify(oper, orig);
2343
InternalEval(aEnvironment, sizearg, Argument(aArguments,2));
2344
CHK_ARG(sizearg.Get() != NULL, 2);
2345
CHK_ARG(sizearg.Get()->String() != NULL, 2);
2347
LispInt arity = InternalAsciiToInt(sizearg.Get()->String()->String());
2349
LispUserFunction* userFunc = aEnvironment.UserFunction(aEnvironment.HashTable().LookUp(oper.String()),arity);
2350
InternalBoolean(aEnvironment,aResult,userFunc != NULL);
2353
void LispDefLoadFunction(LispEnvironment& aEnvironment,LispPtr& aResult,
2354
LispPtr& aArguments)
2358
InternalEval(aEnvironment, name, Argument(aArguments,1));
2359
LispStringPtr orig = name.Get()->String();
2360
CHK_ARG(orig != NULL, 1);
2362
InternalUnstringify(oper, orig);
2364
LispMultiUserFunction* multiUserFunc =
2365
aEnvironment.MultiUserFunction(aEnvironment.HashTable().LookUp(oper.String()));
2366
if (multiUserFunc != NULL)
2368
if (multiUserFunc->iFileToOpen!=NULL)
2370
LispDefFile* def = multiUserFunc->iFileToOpen;
2371
if (!def->iIsLoaded)
2374
/*Show loading... */
2375
printf("Debug> Loading file %s for function %s\n",def->iFileName()->String(),oper.String());
2377
multiUserFunc->iFileToOpen=NULL;
2378
InternalUse(aEnvironment,def->iFileName());
2382
InternalTrue(aEnvironment,aResult);
2386
void LispRuleBaseArgList(LispEnvironment& aEnvironment,LispPtr& aResult, LispPtr& aArguments)
2390
InternalEval(aEnvironment, name, Argument(aArguments,1));
2391
LispStringPtr orig = name.Get()->String();
2392
CHK_ARG(orig != NULL, 1);
2394
InternalUnstringify(oper, orig);
2397
InternalEval(aEnvironment, sizearg, Argument(aArguments,2));
2398
CHK_ARG(sizearg.Get() != NULL, 2);
2399
CHK_ARG(sizearg.Get()->String() != NULL, 2);
2401
LispInt arity = InternalAsciiToInt(sizearg.Get()->String()->String());
2403
LispUserFunction* userFunc = aEnvironment.UserFunction(aEnvironment.HashTable().LookUp(oper.String()),arity);
2404
CHK(userFunc != NULL, KLispErrInvalidArg);
2406
LispPtr& list = userFunc->ArgList();
2408
head.Set(LispAtom::New(aEnvironment.iList));
2409
head.Get()->Next().Set(list.Get());
2410
aResult.Set(LispSubList::New(head.Get()));
2414
static void InternalNewRulePattern(LispEnvironment& aEnvironment, LispPtr& aResult,
2415
LispPtr& aArguments, LispBoolean aMacroMode)
2426
LispStringPtr orig=NULL;
2432
InternalEval(aEnvironment, result, Argument(aArguments,1));
2433
CHK_ARG(result.Get() != NULL, 1);
2434
orig = result.Get()->String();
2435
CHK_ARG(orig != NULL, 1);
2437
InternalEval(aEnvironment, ar, Argument(aArguments,2));
2438
InternalEval(aEnvironment, pr, Argument(aArguments,3));
2439
InternalEval(aEnvironment, predicate, Argument(aArguments,4));
2440
InternalEval(aEnvironment, body, Argument(aArguments,5));
2444
CHK_ARG(Argument(aArguments,1).Get() != NULL, 1);
2445
orig = Argument(aArguments,1).Get()->String();
2446
CHK_ARG(orig != NULL, 1);
2447
ar.Set(Argument(aArguments,2).Get());
2448
pr.Set(Argument(aArguments,3).Get());
2449
predicate.Set(Argument(aArguments,4).Get());
2450
body.Set(Argument(aArguments,5).Get());
2454
CHK_ARG(ar.Get() != NULL, 2);
2455
CHK_ARG(ar.Get()->String() != NULL, 2);
2456
arity = InternalAsciiToInt(ar.Get()->String()->String());
2459
CHK_ARG(pr.Get() != NULL, 3);
2460
CHK_ARG(pr.Get()->String() != NULL, 3);
2461
precedence = InternalAsciiToInt(pr.Get()->String()->String());
2463
// Finally define the rule base
2464
aEnvironment.DefineRulePattern(SymbolName(aEnvironment,orig->String()),
2471
InternalTrue(aEnvironment,aResult);
2474
void LispNewRulePattern(LispEnvironment& aEnvironment, LispPtr& aResult,
2475
LispPtr& aArguments)
2477
InternalNewRulePattern(aEnvironment, aResult,aArguments, LispFalse);
2480
void LispMacroNewRulePattern(LispEnvironment& aEnvironment, LispPtr& aResult,
2481
LispPtr& aArguments)
2483
InternalNewRulePattern(aEnvironment, aResult,aArguments, LispTrue);