DIRECTORY Rope; Sets: CEDAR DEFINITIONS = { ROPE: TYPE = Rope.ROPE; Cant: ERROR [data: REF ANY, msg: ROPE]; Comparison: TYPE = {less, equal, greater, noComparison}; Element: TYPE = REF ElementPrivate; ElementPrivate: TYPE = RECORD [ class: ElementClass, data: REF ANY]; ElementClass: TYPE = REF ElementClassPrivate; ElementClassPrivate: TYPE = RECORD [ data: REF ANY _ NIL, Equal: PROC [e1, e2: Element] RETURNS [equal: BOOL] _ NIL, anOrder: TotalOrder _ NIL ]; MakeElementClass: PROC [ElementClassPrivate] RETURNS [ElementClass]; Set: TYPE = REF SetPrivate; SetPrivate: TYPE = RECORD [ class: SetClass, mutable: BOOL, data: REF ANY]; Enumerator: TYPE = Set--able to Enumerate--; Filter: TYPE = Set--able to TestMembership--; SetClass: TYPE = REF SetClassPrivate; SetClassPrivate: TYPE = RECORD [ data: REF ANY _ NIL, Size: PROC [set: Set] RETURNS [INT] _ NIL, Enumerate: PROC [set: Set, consumer: PROC [Element]] _ NIL, TestMembership: PROC [set: Set, element: Element] RETURNS [BOOL] _ NIL, AddElement: PROC [set: Set, element: Element] _ NIL, DeleteElement: PROC [set: Set, element: Element] _ NIL, Copy: PROC [set: Set] RETURNS [Set] _ NIL, Freeze: PROC [set: Set] RETURNS [--same--Set] _ NIL ]; Enumerate: PROC [set: Set, consumer: PROC [Element]] = INLINE {set.class.Enumerate[set, consumer]}; EnumerateNI: PROC [set: Set, consumer: PROC [Element]]; TestMembership: PROC [set: Set, element: Element] RETURNS [BOOL] = INLINE {RETURN [set.class.TestMembership[set, element]]}; TestMembershipNI: PROC [set: Set, element: Element] RETURNS [BOOL]; AddElement: PROC [set: Set, element: Element] = INLINE {set.class.AddElement[set, element]}; AddElementNI: PROC [set: Set, element: Element]; MakeSetClass: PROC [SetClassPrivate] RETURNS [SetClass]; Sequence: TYPE = REF SequencePrivate; SequencePrivate: TYPE = RECORD [ class: SequenceClass, mutable: BOOL, data: REF ANY]; SequenceClass: TYPE = REF SequenceClassPrivate; SequenceClassPrivate: TYPE = RECORD [ data: REF ANY _ NIL, Length: PROC [seq: Sequence] RETURNS [INT] _ NIL, Range: PROC [seq: Sequence] RETURNS [set: Set] _ NIL, Fetch: PROC [seq: Sequence, index: INT--[0..Length)--] RETURNS [Element] _ NIL, Assign: PROC [seq: Sequence, first, last: INT, element: Element] _ NIL, Insert: PROC [seq: Sequence, before: INT, element: Element] _ NIL, Delete: PROC [seq: Sequence, first, last: INT] _ NIL, Subsequence: PROC [seq: Sequence, first: INT _ 0, length: INT _ LAST[INT]] RETURNS [Sequence] _ NIL, Copy: PROC [seq: Sequence] RETURNS [Sequence] _ NIL, Freeze: PROC [seq: Sequence] RETURNS [--same--Sequence] _ NIL ]; Function: TYPE = REF FunctionPrivate; FunctionPrivate: TYPE = RECORD [ class: FunctionClass, mutable: BOOL, data: REF ANY]; FunctionClass: TYPE = REF FunctionClassPrivate; FunctionClassPrivate: TYPE = RECORD [ data: REF ANY _ NIL, Size: PROC [fn: Function] RETURNS [INT] _ NIL, QuaSet: PROC [fn: Function] RETURNS [set: Set--of 2-long Sequence--] _ NIL, Invert: PROC [fn: Function] RETURNS [inv: Function] _ NIL, Domain: PROC [fn: Function] RETURNS [set: Set] _ NIL, Range: PROC [fn: Function] RETURNS [set: Set] _ NIL, Apply: PROC [fn: Function, arg: Element] RETURNS [Element] _ NIL, Assign: PROC [fn: Function, arg, result: Element] _ NIL, Delete: PROC [fn: Function, arg: Element] _ NIL, Copy: PROC [fn: Function] RETURNS [Function] _ NIL, Freeze: PROC [fn: Function] RETURNS [--same--Function] _ NIL ]; Dictionary: TYPE = Function--whose domain is ROPEs--; Order: TYPE = REF OrderPrivate; OrderPrivate: TYPE = RECORD [ class: OrderClass, mutable: BOOL, data: REF ANY]; OrderClass: TYPE = REF OrderClassPrivate; OrderClassPrivate: TYPE = RECORD [ data: REF ANY _ NIL, Compare: PROC [o: Order, e1, e2: Element] RETURNS [c: Comparison], Copy: PROC [fn: Order] RETURNS [Order] _ NIL, Freeze: PROC [fn: Order] RETURNS [--same--Order] _ NIL ]; TotalOrder: TYPE = Order; }. 4Sets.Mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Spreitzer, January 20, 1986 5:00:37 pm PST Here we define object-oriented, or abstract, data-types for some common mathematical concepts. General Elements Provides default implementations, where appropriate. Sets Tells whether this is actually a set variable or a set. Change a set variable into a set. A non-INLINE version of Enumerate. Provides default implementations, where appropriate. Sequences Functions inv[y] = {x | fn[x] = y} Orders Whose Compare never returns noComparison. Κυ– "cedar" style˜code™ Kšœ Οmœ1™