-- SMVal.mesa
-- last edit by Satterthwaite, August 15, 1983 11:02 am

DIRECTORY
  SMLoad: TYPE USING [LoadInfo],
  SMOps: TYPE USING [MS],
  SMProj: TYPE USING [Proj],
  SMTree: TYPE Tree USING [Handle, Id, Link, Name, SonId],
  SMTreeOps: TYPE --TreeOps-- USING [TM];
	
SMVal: CEDAR DEFINITIONS~{
  OPEN Tree~~SMTree, TreeOps~~SMTreeOps;
  
-- types

 -- LoadMod
	-- stored in Ext of Apply nodes
	-- where first son is an apply, describes bcd files that have been loaded
	-- there is one of these per parse tree node
  LoadMod: TYPE~REF LoadModRecord;
  LoadModRecord: TYPE~RECORD[
    proj: SMProj.Proj←NIL,
    loadInfo: SMLoad.LoadInfo←NIL,
    mustReplace: BOOL←FALSE];	-- => this module must be replaced in the load state

-- operations on model value trees (full evaluated only)

  Binding: PROC[t: Tree.Link] RETURNS[BOOL];
  BtoD: PROC[binding: Tree.Link] RETURNS[decl: Tree.Handle];
  BtoG: PROC[binding: Tree.Link] RETURNS[group: Tree.Handle];
  
  IdName: PROC[id: Tree.Id] RETURNS[Tree.Name];
  IdType: PROC[t: Tree.Id] RETURNS[Tree.Link];
  IdValue: PROC[id: Tree.Id] RETURNS[Tree.Link];

  Select: PROC[binding: Tree.Link, index: Tree.Name] RETURNS[Tree.Link];
  ValOf: PROC[t: Tree.Link] RETURNS[Tree.Link];	-- iterates IdValue for Id's
  ValOfNthSon: PROC[t: Tree.Link, n: Tree.SonId] RETURNS[Tree.Link];  

-- enumeration of operator nodes (evaluates Id's, suppresses multiple visits)

  VisitNodes: PROC[tm: TreeOps.TM, root: Tree.Link, proc: PROC[node, parent: Tree.Link]];
  ResetVisits: PROC[ms: SMOps.MS];
  
-- lambda decomposition

  OuterBody: PROC[t: Tree.Link] RETURNS[formals, body: Tree.Link];
  
-- indirection through value tree to get/set ext from parse tree
  GetExtFromParse: PROC[link: Tree.Link] RETURNS[Tree.Link];
  PutExtInParse: PROC[link: Tree.Link, ext: Tree.Link];

  }.