3
Compiling a line: expression -> LispPtr.
4
Compile(...) is responsible for leaving one result on
19
curBody:=Pop(predefBody,1);
21
PushSection(section):=
23
Push(predefBody,curBody);
28
//Echo({"pushing ",code});
30
DestructiveAppend(curBody,code);
35
// funcs["func"]["arity"]{"args","props",{"precedence","predicate","body"}}
37
MakeFunction(_name)_(predefFuncs[String(name)] = Empty) <--
39
predefFuncs[String(name)] := {};
42
DeclareSimpleFunction(name,args,body):=
44
//Echo({"ENTER ",name,args,body});
46
predefFuncs[String(name)][String(Length(args))] :=
50
{{0,CompileExpression(True),body}}
52
// Echo({predefFuncs});
57
Echo({"Converting file [",f,"] to ",DriverCodeType()});
58
PushSection(initSection);
66
While(line != EndOfFile)
69
If(line != EndOfFile,CompileBaseLine(line));
73
PushSection(initSection);
76
//Echo({initSection});
82
10 # SymbolClob(sym_IsString) <-- String(UniqueConstant());
83
10 # SymbolClob(sym_IsNumber)_(Not IsInteger(sym)) <-- String(UniqueConstant());
84
20 # SymbolClob(sym_IsAtom) <-- "symbol_":String(sym);
85
30 # SymbolClob(_sym) <--
87
Check(False,"Error: trying to make \"":(ToString()Write(sym)):"\" into a symbol");
90
10 # GetSymbol(sym_IsAtom)_(predefSymbols[String(sym)] != Empty) <--
92
(predefSymbols[String(sym)][1]);
94
20 # GetSymbol(sym_IsAtom)_(predefSymbols[String(sym)] = Empty) <--
96
predefSymbols[String(sym)] := {SymbolClob(sym),CompileExpression(sym)};
100
30 # GetSymbol(_sym) <--
102
Check(False,"Error: trying to make \"":(ToString()Write(sym)):"\" into a symbol");
107
10 # Compile(Set(_a,_b)) <--
111
AddAsm(SETVAR(TOP(-1),TOP(0)));
113
AddAsm(SETTRUE(TOP(0)));
116
10 # Compile(a_IsAtom := _b) <--
120
AddAsm(SETVAR(TOP(-1),TOP(0)));
122
AddAsm(SETTRUE(TOP(0)));
126
19 # Compile(a_IsNumber) <-- CompileFixedAtom(a);
127
19 # Compile(True) <-- CompileFixedAtom(True);
128
19 # Compile(False) <-- CompileFixedAtom(False);
130
20 # CompileFixedAtom(a_IsAtom) <--
133
AddAsm(SET(TOP(0),GetSymbol(a)));
136
20 # Compile(a_IsAtom) <--
139
AddAsm(SET(TOP(0),CompileExpression(a)));
140
AddAsm(EVALUATE(TOP(0),TOP(0)));
144
10 # Compile(_f)_(Type(f) = "Local") <--
147
Set(s,Tail(Listify(f)));
150
AddAsm(LOCAL(String(item)));
151
AddAsm(SETTRUE(TOP(0)));
156
//native.GetPrecision(aEnvironment,TOPPTR());
160
0 # TypeIsDefined(_other) <-- (predefFuncs[other]!=Empty);
161
10 # HasNativeDefined(f_IsFunction) <-- TypeIsDefined(Type(f));
162
20 # HasNativeDefined(_other) <-- False;
163
10 # Compile(f_HasNativeDefined) <--
165
// place holder for result
170
Set(args,Tail(Listify(f)));
171
ForEach(item,args)Compile(item);
174
AddAsm(NATIVEDEFINED(Type(f):"_":String(Length(args))));
178
// TypeIsNative can be expanded upon in the driver
179
20 # TypeIsNative(_other) <-- False;
180
10 # HasNative(f_IsFunction) <-- TypeIsNative(Type(f));
181
20 # HasNative(_other) <-- False;
182
10 # Compile(f_HasNative) <--
184
// place holder for result
189
Set(args,Tail(Listify(f)));
190
ForEach(item,args)Compile(item);
193
AddAsm(NATIVE(Type(f):"_":String(Length(args))));
197
10 # Compile(_f)_(Type(f) = "Prog") <--
201
// Write(Subst(v,f)Hold(v));
202
Set(f,Tail(Listify(Subst(v,f)Hold(v))));
203
// Write(Subst(v,f)Hold(v));
209
If(f!={},AddAsm(POP()));
211
AddAsm(COPY(TOP(-1),TOP(0)));
214
// AddAsm(SETTRUE(TOP(0)));
218
100 # Compile(_line) <--
223
AddAsm(SET(TOP(0),CompileExpression(line)));
224
AddAsm(EVALUATE(TOP(-1),TOP(0)));
228
AddAsm(SET(TOP(0),CompileExpression(line)));
229
AddAsm(EVALUATE(TOP(0),TOP(0)));
233
10 # CompileBaseLine(f_IsFunction := _body)_(Type(f)!="Nth") <--
237
// Echo({"Function definition!"});
238
Local(name,args,bd,fn);
252
AddAsm(EVALUATE(TOP(i),TOP(i)));
257
AddAsm(LOCAL(String(var)));
259
Set(i,-(Length(args)-1));
262
AddAsm(SETVARSTR(String(var),TOP(i)));
280
AddAsm(SET(TOP(0),"Argument(aArguments,":String(i):")"));
281
AddAsm(EVALUATE(TOP(0),TOP(0)));
284
AddAsm(LOCAL(String(var)));
286
AddAsm(SETVARSTR(String(var),TOP(0)));
292
AddAsm(COPY(TOP(-1),TOP(0)));
293
// AddAsm(COPY(aResult,TOP(0)));
298
DeclareSimpleFunction(name,args,bd);
301
100 # CompileBaseLine(_line) <--
303
PushSection(initSection);
310
10 # Compile(If(_a,_b)) <--
312
Echo({"if (IsTrue()) Evaluate();"});
320
//CompileExpression(_expr) <-- (CompileLine(expr)[1]);
321
CompileExpression(_expr) <-- (CompileLine(expr));
323
RuleBase("CompileLineHeld",{arg});
324
HoldArg("CompileLineHeld",arg);
325
CompileLineHeld(_arg) <--
330
10 # CompileLine(expr_IsFunction) <--
334
Set(rs,Listify(expr));
336
Set(rs,MapSingle("CompileLineHeld",rs));
338
// Set(rs,Flatten(rs,"List"));
347
rs[n] := "AtomAdd(":rs[n]:",":rs[n+1]:")";
353
// Set(rs,Apply("ConcatStrings",rs));
354
// {"MAKELIST(":rs:"LA(NULL))","+"};
358
20 # CompileLine(expr_IsAtom) <--
360
// {"MAKEATOM(\"":CEscape(String(expr)):"\")","+"};
361
"MAKEATOM(\"":CEscape(String(expr)):"\")";
364
30 # CompileLine(_expr) <-- Check(False,"Expression not handled");
369
Optimize(list_IsList) <-- ClosePushPops(list);
371
ClosePeep(POP(), PUSH()) <--
373
DestructiveDelete(list,i);
374
DestructiveDelete(list,i);
380
ClosePeep(SETTRUE(TOP(0)),POP()) <--
382
DestructiveDelete(list,i);
387
ClosePeep(SETTRUE(TOP(0)),SET(TOP(0),_a)) <--
389
DestructiveDelete(list,i);
394
ClosePeep(EVALUATE(TOP(0),TOP(0)),COPY(_a,TOP(0))) <--
396
list[i] := EVALUATE(a,TOP(0));
397
DestructiveDelete(list,i+1);
403
UnFence("ClosePeep",2);
404
ClosePushPops(_list) <--
409
//Echo({"lsit = ",list});
413
ClosePeep(list[i],list[i+1]);
416
If(list[i] = POP() And list[i+1] = PUSH(),
418
// Echo({"deleting at ",list[i]});
419
// Echo({"deleting at ",list[i+1]});
420
DestructiveDelete(list,i);
421
DestructiveDelete(list,i);