123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- % MAIN6.RED : Small READ-EVAL-PRINT Loop, Binding test
- % Needs IO, SUB2, SUB3, SUB4, SUB5, SUB6
- % Added REsult after FREErstr check
- IN "xxx-header.red"$
- IN "PT:STUBS3.RED"$
- IN "PT:STUBS4.RED"$
- IN "PT:STUBS5.RED"$
- IN "PT:STUBS6.RED"$
- on syslisp;
- Compiletime GLOBAL '(DEBUG !*RAISE !$EOF!$);
- Procedure FirstCall;
- Begin scalar x, Done, Hcount;
- Init();
- InitHeap();
- InitObList();
- InitEval();
- Prin2t '"MINI-PSL: A Read-Eval-Print Loop, terminate with Q";
- Prin2T '" !*RAISE has been set T";
- Prin2T '" Run (TESTSERIES) to check BINDING etc";
- LispVar(DEBUG) := 'NIL; % For nice I/O
- InitRead();
- LispVar(!*RAISE) := 'T; % Upcase Input IDs
- LispVar(!$EOF!$) := MKID Char EOF; % Check for EOF
- Hcount :=0;
- Prin2t " .... Now Call INITCODE";
- InitCode();
- Prin2t " .... Return from INITCode, Now toploop";
- While Not Done do
- <<Hcount:=Hcount+1;
- Prin2 Hcount; Prin2 '" lisp> ";
- x:=READ();
- if x eq 'Q then Done := 'T
- else if x = !$EOF!$ then
- <<Terpri();
- Prin2T " **** Top Level EOF **** ">>
- else <<Terpri();
- x:=EVAL x;
- Print x>>;
- >>;
- Quit;
- End;
- CompileTime FLUID '(AA);
- Procedure TESTSERIES();
- Begin
- BindingTest();
- InterpTest();
- CompBindTest();
- End;
- Procedure BindingTest;
- Begin
- Dashed "Test BINDING Primitives"$
- LispVar(AA):=1;
- PBIND1('AA); % Save the 1, insert a NIL
- LBIND1('AA,3); % save the NIL, insert a 3
- ShouldBe('"3rd bound AA",LispVar(AA),3);
- UnBindN 1;
- ShouldBe('"2rd bound AA",LispVar(AA),NIL);
- UnBindN 1;
- ShouldBe('"Original AA",LispVar(AA),1);
- End;
- Global '(Lambda1 Lambda2 CodeForm!*);
- Procedure InterpTest();
- Begin
- Dashed "TEST of Interpreter Primitives for LAMBDA's ";
- Lambda1:='(LAMBDA (X1 X2) (PRINT (LIST 'LAMBDA1 X1 X2)) 'L1);
- Lambda2:='(LAMBDA (Y1 Y2) (PRINT (LIST 'LAMBDA2 Y1 Y2)) 'L2);
- Spaced "LAMBDA1: "; Print Lambda1;
- Dashed "FastLambdaApply on Lambda1";
- CodeForm!*:=Lambda1;
- ShouldBe("FastLambdaApply", FastLambdaApply(10,20),'L1);
- Dashed "Now Test FASTAPPLY";
- TestApply(" Compiled ID 1 ", 'Compiled1,'C1);
- TestApply(" CodePointer 2 ", GetFcodePointer 'Compiled2,'C2);
- TestApply(" Lambda Expression 1 ", Lambda1,'L1);
- Dashed "Test a compiled call on Interpreted code ";
- PutD('Interpreted3,'Expr,
- '(LAMBDA (ag1 ag2 ag3) (Print (list 'Interpreted3 Ag1 Ag2 Ag3)) 'L3));
- ShouldBe(" FlambdaLinkP",FlambdaLinkP 'Interpreted3,T);
- ShouldBe(" Interp3", Interpreted3(300,310,320),'L3);
- PutD('Interpreted2,'Expr,Lambda2);
- TestApply(" Interpreted ID 2 ", 'Interpreted2,'L2);
- End;
- LAP '((!*entry TestFastApply expr 0)
- (!*alloc 0)
- % Args loaded so move to fluid and go
- (!*Move (FLUID TestCode!*) (reg t1))
- (!*dealloc 0)
- (!*JCALL FastApply));
- Procedure TestApply(Msg,Fn,Answer);
- Begin scalar x;
- Prin2 " Testapply case "; prin2 Msg;
- Prin2 " given ";
- Print Fn;
- TestCode!* := Fn;
- x:=TestFastApply('A,'B);
- Return ShouldBe(" answer",x,Answer);
- End;
- Procedure Compiled1(xxx,yyy);
- <<Prin2 " Compiled1(";
- Prin1 xxx; Prin2 " "; Prin1 yyy; Prin2T ")";
- 'C1>>;
- Procedure Compiled2(xxx,yyy);
- <<Prin2 " Compiled2(";
- Prin1 xxx; Prin2 " "; Prin1 yyy; Prin2T ")";
- 'C2>>;
- CompileTime Fluid '(CFL1 CFL2 CFL3);
- Procedure CompBindTest();
- Begin
- Dashed "Test LAMBIND and PROGBIND in compiled code";
- CFL1:='TOP1;
- CFL2:='TOP2;
- Shouldbe("After Cbind1, result ",
- Cbind1('Mid0,'Mid1,'Mid2), 'Result!-Cbind1);
- Shouldbe("CFL1",CFL1,'Top1);
- Shouldbe("CFL2",CFL2,'Top2);
- End;
- procedure Cbind1(x,CFL1,CFL2);
- Begin
- Shouldbe("x ",x ,'Mid0);
- Shouldbe("CFL1",CFL1,'Mid1);
- Shouldbe("CFL2",CFL2,'Mid2);
- Shouldbe("After Cbind2, result ",
- Cbind2(),'Result!-Cbind2);
- Shouldbe("CFL1",CFL1,'Bot1);
- Shouldbe("CFL2",CFL2,'Mid2);
- Return 'Result!-Cbind1;
- End;
- Procedure Cbind2();
- Begin scalar zz;
- Shouldbe("CFL1",CFL1,'Mid1);
- Shouldbe("CFL2",CFL2,'Mid2);
- zz:=Begin scalar x,CFL2;
- CFL1:='Bot1;
- CFL2:='Bot2;
- Shouldbe("CFL1",CFL1,'Bot1);
- Shouldbe("CFL2",CFL2,'Bot2);
- Return 'Inner!-Cbind2;
- End;
- Shouldbe("After inner BEGIN ",zz,'Inner!-Cbind2);
- Shouldbe("CFL1",CFL1,'Bot1);
- Shouldbe("CFL2",CFL2,'Mid2);
- Return 'Result!-Cbind2;
- End;
- End;
|