DIRECTORY Rope, IO, Convert, AlgebraClasses, Variables, Ints, Sequences, VariableSequences; VariableSequencesImpl: CEDAR PROGRAM IMPORTS Rope, Convert, AlgebraClasses, Variables, Sequences EXPORTS VariableSequences = BEGIN OPEN AC: AlgebraClasses, VARS: Variables, SEQ: Sequences, VariableSequences; ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; Object: TYPE = AC.Object; Method: TYPE = AC.Method; TypeError: PUBLIC ERROR [message: ATOM _ $Unspecified] = CODE; VariableSequences: PUBLIC AC.Object _ SEQ.MakeSequenceStructure[VARS.Variables]; VariableFirstChar: PUBLIC PROC [char: CHAR, V: VariableSequence] RETURNS [BOOL] ~ { vData: SEQ.SequenceData _ NARROW[V.data]; FOR i:NAT IN [1..vData.lengthPlus1) DO IF Rope.Equal[ Convert.RopeFromChar[from: char, quote: FALSE], Rope.Substr[VARS.ToRope[vData[i] ], 0, 1] ] THEN RETURN[TRUE]; ENDLOOP; RETURN[FALSE]; }; MergeVariableSequences: PUBLIC AC.BinaryOp ~ { firstSeqData: SEQ.SequenceData _ NARROW[firstArg.data]; secondSeqData: SEQ.SequenceData _ NARROW[secondArg.data]; firstStructureData: SEQ.SequenceStructureData _ NARROW[firstArg.class.data]; secondStructureData: SEQ.SequenceStructureData _ NARROW[firstArg.class.data]; firstElementStructure: Object _ firstStructureData.elementStructure; secondElementStructure: Object _ firstStructureData.elementStructure; intIndex: Ints.Int; lowVars, lowVarsPointer: LIST OF VARS.Variable; lowVarSeq: VariableSequence _ NIL; IF NOT AC.StructureEqual[firstElementStructure, secondElementStructure] THEN TypeError[]; FOR i:INT IN [1..firstSeqData.lengthPlus1) DO intIndex _ SEQ.Find[secondArg, firstSeqData[i] ]; IF intIndex=NIL THEN { IF lowVars # NIL THEN lowVarsPointer _ lowVarsPointer.rest _ LIST[firstSeqData[i] ] ELSE lowVars _ lowVarsPointer _ LIST[firstSeqData[i] ]; }; ENDLOOP; IF lowVars # NIL THEN lowVarSeq _ SEQ.MakeSequence[lowVars, VariableSequences]; RETURN[SEQ.Concatenate[lowVarSeq, secondArg] ]; }; NewMainVariable: PUBLIC AC.BinaryOp ~ { pos: Ints.Int _ SEQ.Find[firstArg, secondArg]; delSeq: Object; IF pos#NIL THEN delSeq _ SEQ.Delete[firstArg, pos] ELSE delSeq _ firstArg; RETURN[ SEQ.Append[delSeq, secondArg] ]; }; END. ΨVariableSequencesImpl.mesa Last Edited by: Arnon, June 10, 1985 4:19:22 pm PDT Types Public Structure Operations MakeVariableSequence: PUBLIC AC.ListImbedOp ~ SEQ.MakeSequence; This will become Method $variableSequence of structure VariableSequences. All variables of firstArg that do not occur in secondArg are placed at left (low) end of result; all variables Variables X and Y may occur in different order in the two args; no note is made of this; they will occur in result in the order they had in secondArg. firstArg is a VariableSequence, secondArg is a Variable that may or may not occur in firstArg. result is firstArg with reordered variables so that secondArg is new main variable. Order of other variables is preserved Start Code Kludge up special subclass for VariableSequences **5/3/87 obsolete variableSequenceMethod: Method _ AC.MakeMethod[ListImbedOp, FALSE, NEW[AC.ListImbedOp _ MakeVariableSequence], NIL, "variableSequence"]; variableSequencesClass: AC.Object _ AC.MakeClass["variableSequencesClass", VariableSequences.class, NIL]; AC.AddMethodToClass[$variableSequence, variableSequenceMethod, variableSequencesClass]; VariableSequences.class _ variableSequencesClass; AC.InstallStructure[VariableSequences]; Κο˜Jšœ™J™3J˜šΟk ˜ Jšœ˜Jšœ˜J˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ˜—head2šœœ˜$Jšœ5˜—šž™Jš žœœœ œœ ˜P—šž ™ šžœœœœžœœœ˜SMšœœœ ˜)šœœœ˜&šœ ˜Mšœ(œ˜/Mšœ œ˜)—Mšœœœœ˜Mšœ˜—Mšœœ˜M˜M˜—šžœœœœ™?MšœI™IM™—šžœœœ ˜.Mšœ‡™‡Jšœœœ˜7Jšœœœ˜9Jšœœœ˜LJšœœœ˜MJšœD˜DJšœE˜EJšœ˜Jšœœœœ ˜/Jšœœ˜"Jšœœœ?œ ˜Yšœœœ˜-Jšœ œ#˜1šœ œœ˜šœ œ˜Mšœ'œ˜=—š˜Mšœœ˜2—M˜—Jšœ˜—Jšœ œœ œ*˜OJšœœ%˜/M˜M˜—šžœœœ ˜'JšœΪ™ΪJšœœ˜.Jšœ˜šœœ˜Jšœ œ˜"—š˜Jšœ˜—Jšœœ˜(J˜——™ MšœB™BJš œ!œœœœ&œ™ˆMšœœ œ>œ™iJšœU™WJšœ1™1Jšœ%™'—J˜Jšœ˜J˜—…—f-