-- PL.Mesa
-- last modifed by Schmidt August 22, 1982 2:22 pm
DIRECTORY
IO: TYPE USING [Handle],
PString: TYPE USING [Stream],
Rope: TYPE USING [ROPE];
PL: CEDAR DEFINITIONS = {
IS, OS, ES: IO.Handle;
Z: ZONE;
NodeType: TYPE = {ZERO,ID,STR,NUM, HOLE,LST,CAT,GTR,PAPPLY,FCN, ASS,
PROG,FAIL,SEQOF,OPT, SEQOFC, DELETE, MAPPLY,
UNARY,PLUS,MINUS,GOBBLE,PALT,
SEQ, CATL,WILD, PATTERN,ITER,TILDE,EQUAL, ENV,
CLOSURE,COMB, UNDEFINED};
Node: TYPE = REF NodeRecord;
NodeRecord: TYPE = RECORD[
e: BOOLEAN ← FALSE, -- if TRUE, this node has been eval'ed
Var: SELECT Type: NodeType FROM
-- base
ID => [name: Symbol],
STR => [str: Rope.ROPE],
NUM => [num: INT ],
FAIL, WILD, HOLE,UNDEFINED => NULL,
-- inductive
COMB => [proc: Symbol, parm: Node],
ASS => [lhs: Symbol, rhs: Node],
LST => [listhead: Node, listtail: LSTNode],
CAT,CATL,EQUAL, GTR, PALT, PAPPLY, MAPPLY,
GOBBLE, ITER, PROG, PLUS, MINUS, SEQ
=> [left,right: Node],
FCN => [parms, fcn: Node],
SEQOF, SEQOFC, OPT, DELETE => [pat: Node],
PATTERN=> [pattern:Node],
TILDE => [not: Node],
CLOSURE => [exp: Node, env: Environment],
ENDCASE
];
LSTNodeRecord: TYPE = LST NodeRecord;
LSTNode: TYPE = REF LSTNodeRecord;
rID: TYPE = REF ID NodeRecord;
rSTR: TYPE = REF STR NodeRecord;
rNUM: TYPE = REF NUM NodeRecord;
rFAIL: TYPE = REF FAIL NodeRecord;
rWILD: TYPE = REF WILD NodeRecord;
rHOLE: TYPE = REF HOLE NodeRecord;
rUNDEFINED: TYPE = REF UNDEFINED NodeRecord;
rCOMB: TYPE = REF COMB NodeRecord;
rASS: TYPE = REF ASS NodeRecord;
rLST: TYPE = REF LST NodeRecord;
rCAT: TYPE = REF CAT NodeRecord;
rCATL: TYPE = REF CATL NodeRecord;
rEQUAL: TYPE = REF EQUAL NodeRecord;
rGTR: TYPE = REF GTR NodeRecord;
rPALT: TYPE = REF PALT NodeRecord;
rPAPPLY: TYPE = REF PAPPLY NodeRecord;
rMAPPLY: TYPE = REF MAPPLY NodeRecord;
rGOBBLE: TYPE = REF GOBBLE NodeRecord;
rITER: TYPE = REF ITER NodeRecord;
rPROG: TYPE = REF PROG NodeRecord;
rPLUS: TYPE = REF PLUS NodeRecord;
rMINUS: TYPE = REF MINUS NodeRecord;
rSEQ: TYPE = REF SEQ NodeRecord;
rFCN: TYPE = REF FCN NodeRecord;
rSEQOF: TYPE = REF SEQOF NodeRecord;
rSEQOFC: TYPE = REF SEQOFC NodeRecord;
rOPT: TYPE = REF OPT NodeRecord;
rDELETE: TYPE = REF DELETE NodeRecord;
rPATTERN: TYPE = REF PATTERN NodeRecord;
rTILDE: TYPE = REF TILDE NodeRecord;
rCLOSURE: TYPE = REF CLOSURE NodeRecord;
Environment: TYPE = REF ERecord;
ERecord: TYPE =
RECORD[name: Symbol, val: Node, next: Environment];
Symbol: TYPE = REF SymbolRecord;
SymbolRecord: TYPE = RECORD[
name: Rope.ROPE ← NIL,
son: ARRAY [0..1] OF Symbol ← ALL[NIL],
x:SELECT t: * FROM
VAL => [v: Node],
ZARY => [p: PROC[Node] RETURNS[Node]],
UNARY => [p: PROC[Node,Node] RETURNS[Node]],
PFUNC => [p: PROC[PString.Stream] RETURNS[Node, PString.Stream]],
PFUNC1 => [p: PROC[PString.Stream,Node]
RETURNS[Node, PString.Stream]],
ENDCASE
];
rVAL: TYPE = REF VAL SymbolRecord;
rZARY: TYPE = REF ZARY SymbolRecord;
rUNARY: TYPE = REF UNARY SymbolRecord;
rPFUNC: TYPE = REF PFUNC SymbolRecord;
rPFUNC1: TYPE = REF PFUNC1 SymbolRecord;
--
NumLines: CARDINAL = 35;
NumPages: CARDINAL = 35;
sSize: CARDINAL = 500;
cdebug: BOOLEAN = FALSE;
--
-- defined in PLSupImpl.Mesa
PBug: SIGNAL[est: Rope.ROPE];
SErr: SIGNAL[est: Rope.ROPE];
RErr: SIGNAL[est: Rope.ROPE];
EndDisplay: SIGNAL;
Interrupt: SIGNAL;
--
--
-- defined in PLParseImpl.mesa
ParseSetup: PROC;
Dist: PROC[Rope.ROPE] RETURNS[Node];
SetCurrentNode: PROC[Node];
--
-- defined in PLEvalImpl.mesa
EQ: PROC[Rope.ROPE, Rope.ROPE] RETURNS [BOOLEAN];
Equal: PROC[Node, Node] RETURNS[BOOLEAN];
SN: PROC[Rope.ROPE] RETURNS[Node];
BlessString: PROC[Node] RETURNS[Rope.ROPE];
BlessLST: PROC[Node] RETURNS[LSTNode];
PtoR: PROC[LONG POINTER] RETURNS[REF];
Eval: PROC[Node,Environment] RETURNS[Node];
MapList: PROC[LSTNode,PROC[Node] RETURNS[Node]] RETURNS[LSTNode];
Map: PROC[LSTNode,PROC[Node]] ;
LengthList: PROC[LSTNode] RETURNS[CARDINAL];
NewNail: PROC RETURNS[LSTNode];
--
-- defined in PLSupImpl.mesa
SupSetup: PROC;
SupReset: PROC;
-- defined in PLStoreImpl.mesa
Preorder: PROC[Node, PROC[Node]RETURNS[BOOLEAN]];
ParseTree: PROC[Node];
Insert: PROC[Rope.ROPE, SymbolRecord] RETURNS[Symbol];
Lookup: PROC[Rope.ROPE] RETURNS[Symbol];
StoreSetup: PROC;
StoreReset: PROC;
StoreCleanup: PROC;
GetSpecialNodes: PROC RETURNS[rFAIL,rSTR,LSTNode];
}.