DIRECTORY PS; PSArrayImpl: CEDAR PROGRAM IMPORTS PS ~ BEGIN OPEN PS; ArrayCreate: PUBLIC PROC [size: INT] RETURNS [Array] ~ { IF size<0 THEN ERROR Error[rangecheck]; IF size IN ArrayIndex THEN { ref: ArrayRef ~ NEW[ArrayRep[size]]; RETURN[[ val: [executable: FALSE, variant: array[access: unlimited, start: 0, length: size]], ref: ref ]]; } ELSE ERROR Error[limitcheck]; }; ArrayGet: PUBLIC PROC [array: Array, index: INT] RETURNS [Any] ~ { IF index NOT IN [0..array.val.length) THEN ERROR Error[rangecheck]; RETURN [array.ref[array.val.start+index]]; }; ArrayPut: PUBLIC PROC [array: Array, index: INT, x: Any] ~ { IF index NOT IN[0..array.val.length) THEN ERROR Error[rangecheck]; array.ref[array.val.start+index] _ x; }; ArrayGetInterval: PUBLIC PROC [array: Array, index, count: INT] RETURNS [Array] ~ { IF index NOT IN [0..array.val.length] THEN ERROR Error[rangecheck]; IF count NOT IN [0..(array.val.length-index)] THEN ERROR Error[rangecheck]; RETURN[[ val: [executable: array.val.executable, variant: array[ access: array.val.access, start: array.val.start+index, length: count]], ref: array.ref ]]; }; ArrayPutInterval: PUBLIC PROC [array: Array, index: INT, interval: Array] ~ { subarray: Array ~ ArrayGetInterval[array, index, ArrayLength[interval]]; FOR i: INT IN[0..ArrayLength[subarray]) DO ArrayPut[subarray, i, ArrayGet[interval, i]]; ENDLOOP; }; ArrayCopy: PUBLIC PROC [array1, array2: Array] RETURNS [Array] ~ { subarray2: Array ~ ArrayGetInterval[array2, 0, ArrayLength[array1]]; ArrayPutInterval[subarray2, 0, array1]; RETURN [subarray2]; }; ArrayForAll: PUBLIC PROC [array: Array, action: PROC [Any]] ~ { FOR index: INT IN [0..ArrayLength[array]) DO action[ArrayGet[array, index]]; ENDLOOP; }; END. ΦPSArrayImpl.mesa Copyright Σ 1986, 1987 by Xerox Corporation. All rights reserved. Doug Wyatt, May 15, 1987 11:47:52 am PDT PostScript implementation: array operations. Basic Array operations FOR i: ArrayIndex IN[0..ref.maxLength) DO ref[i] _ null ENDLOOP; ArrayLength: PUBLIC PROC [array: Array] RETURNS [INT] ~ { RETURN [array.val.length]; }; ArrayAccess: PUBLIC PROC [array: Array] RETURNS [Access] ~ { RETURN [array.val.access]; }; Other Array operations Κ˜codešœ™KšœB™BK™(—K˜K™,K™šΟk ˜ Kšœ˜—K˜KšΟn œœ˜Kšœ˜ Kšœœœœ˜head™š ž œœœœœ ˜8Kšœœœ˜'šœœ œ˜Kšœœ˜$Kšœœœœ™@šœ˜Kšœœ>˜UKšœ˜Kšœ˜—K˜—Kšœœ˜K˜K˜—š ž œœœœœ™9Kšœ™K™K™—šž œœœœ ™