DIRECTORY PS; PSPolyImpl: CEDAR PROGRAM IMPORTS PS ~ BEGIN OPEN PS; Pcopy: PROC [self: Root] ~ { arg: Any ~ PopAny[self]; SELECT Type[arg] FROM integer => { n: INT ~ IntFromAny[arg]; Copy[self, n]; }; array => { array2: Array ~ ArrayFromAny[arg]; array1: Array ~ PopArray[self]; IF array1.access { string2: String ~ StringFromAny[arg]; string1: String ~ PopString[self]; IF string1.access { dict2: Dict ~ DictFromAny[arg]; dict1: Dict ~ PopDict[self]; IF dict1.ref.access ERROR Error[typecheck]; }; Plength: PROC [self: Root] ~ { arg: Any ~ PopAny[self]; length: INT; SELECT Type[arg] FROM array => { array: Array ~ ArrayFromAny[arg]; IF array.access { string: String ~ StringFromAny[arg]; IF string.access { dict: Dict ~ DictFromAny[arg]; IF dict.ref.access length _ NameLength[NameFromAny[arg]]; ENDCASE => ERROR Error[typecheck]; PushInt[self, length]; }; Pget: PROC [self: Root] ~ { key: Any ~ PopAny[self]; arg: Any ~ PopAny[self]; SELECT Type[arg] FROM array => { array: Array ~ ArrayFromAny[arg]; index: INT ~ IntFromAny[key]; IF array.access { string: String ~ StringFromAny[arg]; index: INT ~ IntFromAny[key]; IF string.access { dict: Dict ~ DictFromAny[arg]; IF dict.ref.access ERROR Error[typecheck]; }; Pput: PROC [self: Root] ~ { arg3: Any ~ PopAny[self]; arg2: Any ~ PopAny[self]; arg1: Any ~ PopAny[self]; SELECT Type[arg1] FROM array => { array: Array ~ ArrayFromAny[arg1]; index: INT ~ IntFromAny[arg2]; IF array.access { string: String ~ StringFromAny[arg1]; index: INT ~ IntFromAny[arg2]; int: INT ~ IntFromAny[arg3]; IF string.access { dict: Dict ~ DictFromAny[arg1]; IF dict.ref.access ERROR Error[typecheck]; }; Pgetinterval: PROC [self: Root] ~ { count: INT ~ PopInt[self]; index: INT ~ PopInt[self]; arg1: Any ~ PopAny[self]; SELECT Type[arg1] FROM array => { array: Array ~ ArrayFromAny[arg1]; IF array.access { string: String ~ StringFromAny[arg1]; IF string.access ERROR Error[typecheck]; }; Pputinterval: PROC [self: Root] ~ { arg2: Any ~ PopAny[self]; index: INT ~ PopInt[self]; arg1: Any ~ PopAny[self]; SELECT Type[arg1] FROM array => { array1: Array ~ ArrayFromAny[arg1]; array2: Array ~ ArrayFromAny[arg2]; IF array1.access { string1: String ~ StringFromAny[arg1]; string2: String ~ StringFromAny[arg2]; IF string1.access ERROR Error[typecheck]; }; Pforall: PROC [self: Root] ~ { proc: Any ~ PopAny[self]; arg: Any ~ PopAny[self]; SELECT Type[arg] FROM array => { array: Array ~ ArrayFromAny[arg]; action: PROC [x: Any] ~ { PushAny[self, x]; Execute[self, proc]; }; IF array.access CONTINUE]; }; string => { string: String ~ StringFromAny[arg]; action: PROC [c: CHAR] ~ { PushInt[self, IntFromChar[c]]; Execute[self, proc]; }; IF string.access CONTINUE]; }; dict => { dict: Dict ~ DictFromAny[arg]; action: PROC [key, val: Any] ~ { PushAny[self, key]; PushAny[self, val]; Execute[self, proc]; }; IF dict.ref.access CONTINUE]; }; ENDCASE => ERROR Error[typecheck]; }; PolyPrimitives: PROC [self: Root] ~ { Register[self, "copy", Pcopy]; Register[self, "length", Plength]; Register[self, "get", Pget]; Register[self, "put", Pput]; Register[self, "getinterval", Pgetinterval]; Register[self, "putinterval", Pputinterval]; Register[self, "forall", Pforall]; }; RegisterPrimitives[PolyPrimitives]; END. ΊPSPolyImpl.mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. Doug Wyatt, May 8, 1987 6:32:42 pm PDT PostScript implementation: polymorphic operations. Primitives Κe˜codešœ™Kšœ<™K˜'K˜—Kšœœ˜"—K˜K˜—šžœœ˜K˜Kšœœ˜ šœ ˜šœ ˜ K˜!Kšœœœ˜9Kšœ˜K˜—šœ ˜ K˜$Kšœœœ˜:Kšœ˜K˜—šœ ˜ K˜Kšœœœ˜