<> <> <<>> DIRECTORY AMBridge, AMTypes, Commander, EvalQuote, InterpreterOps, IO, List, PPTree, PPTreeOps, PrintTV, ProcessProps, Rope, SafeStorage, SymTab; StatementFunctions: CEDAR PROGRAM IMPORTS AMBridge, AMTypes, EvalQuote, InterpreterOps, IO, List, PPTreeOps, PrintTV, ProcessProps, Rope, SafeStorage, SymTab = BEGIN ROPE: TYPE = Rope.ROPE; TV: TYPE = AMTypes.TV; Type: TYPE = AMTypes.Type; SymbolTable: TYPE = SymTab.Ref; EvalHead: TYPE = InterpreterOps.EvalHead; Tree: TYPE = InterpreterOps.Tree; nullType: Type = AMTypes.nullType; GetStream: PROC RETURNS [IO.STREAM] = { WITH List.Assoc[$CommanderHandle, ProcessProps.GetPropList[]] SELECT FROM cmd: Commander.Handle => RETURN [cmd.out]; ENDCASE => RETURN [NIL]; }; empty: TV _ AMTypes.GetEmptyTV[]; Fields: TYPE = REF FieldsRep; FieldsRep: TYPE = RECORD [ named: BOOLEAN, fields: SEQUENCE length: CARDINAL OF Field]; Field: TYPE = RECORD [ name: ROPE _ NIL, type: AMTypes.Type _ nullType, typed, valued: BOOLEAN _ FALSE, value: REF ANY _ NIL]; typeType: Type; typeAsTV: TV; typeAsType: REF Type; MyTreeToType: PROC [tree: Tree, head: EvalHead] RETURNS [type: Type] = BEGIN asTV: TV; itsType: Type; asTV _ InterpreterOps.Eval[tree, head]; IF SafeStorage.EquivalentTypes[typeType, AMTypes.TVType[asTV]] THEN BEGIN AMTypes.Assign[typeAsTV, asTV]; RETURN[typeAsType^]; END; itsType _ AMTypes.TVType[asTV]; SELECT AMTypes.TypeClass[AMTypes.UnderType[itsType]] FROM type => RETURN[AMTypes.TVToType[asTV]]; ENDCASE => BEGIN head.helpFatalClosure.proc[data: head.helpFatalClosure.data, head: head, parent: tree, msg: "Not a TYPE"]; END; END; Mush: PROC [tv: TV] RETURNS [mushy: TV] = BEGIN <> <> IF AMTypes.TVStatus[tv] = mutable THEN RETURN[tv]; mushy _ AMTypes.Copy[tv]; <> <