-- 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];

}.