DIRECTORY IO; Priming: CEDAR PROGRAM IMPORTS IO = BEGIN CardTable: TYPE = REF CardTablePrivate; CardTablePrivate: TYPE = RECORD [ length: NAT _ 0, cards: SEQUENCE size: NAT OF CARDINAL ]; GenTo: PROC [n, size: CARDINAL] RETURNS [ct: CardTable] = { nextCenter: CARDINAL _ 6; nextLow: BOOL _ TRUE; ct _ NEW [CardTablePrivate[size]]; ct.length _ 2; ct[0] _ 2; ct[1] _ 3; DO { candidate: CARDINAL = IF nextLow THEN (nextCenter-1) ELSE (nextCenter+1); IF candidate > n THEN EXIT; FOR j: NAT IN [0 .. ct.length) DO IF candidate MOD ct[j] = 0 THEN GOTO Fail; ENDLOOP; ct[ct.length] _ candidate; ct.length _ ct.length + 1; EXITS Fail => NULL; }; IF (nextLow _ NOT nextLow) THEN { IF nextCenter > LAST[CARDINAL]-6 THEN EXIT; nextCenter _ nextCenter + 6; }; ENDLOOP }; FilterUp: PROC [ict: CardTable, factor: REAL, start: REAL _ 0.0] RETURNS [fct: CardTable] = { seek: REAL _ start; fct _ NEW [CardTablePrivate[ict.length]]; fct.length _ 0; FOR i: NAT IN [0 .. ict.length) DO IF seek <= ict[i] THEN { fct[fct.length] _ ict[i]; fct.length _ fct.length + 1; seek _ ict[i] * factor; }; ENDLOOP; fct _ fct; }; FilterDown: PROC [ict: CardTable, factor: REAL, start: REAL _ 65536.0] RETURNS [fct: CardTable] = { seek: REAL _ start; fct _ NEW [CardTablePrivate[ict.length]]; fct.length _ 0; FOR i: NAT DECREASING IN [0 .. ict.length) DO IF ict[i] <= seek THEN { fct[fct.length] _ ict[i]; fct.length _ fct.length + 1; seek _ ict[i] / factor; }; ENDLOOP; fct _ fct; }; ReverseInPlace: PROC [ct: CardTable] = { FOR i: NAT IN [0 .. ct.length/2) DO j: NAT _ ct.length-1-i; c: CARDINAL _ ct[i]; ct[i] _ ct[j]; ct[j] _ c; ENDLOOP; }; PrettyPrint: PROC [to: IO.STREAM, ct: CardTable, width: NAT] = { to.PutF["\n%lindex +", [rope["f"]] ]; FOR i: NAT IN [0 .. width) DO to.PutF[" %05g", [integer[i]]] ENDLOOP; to.PutRope["\n-------"]; FOR i: NAT IN [0 .. width) DO to.PutRope["------"] ENDLOOP; FOR i: NAT IN [0 .. ct.length) DO IF i MOD width = 0 THEN to.PutF["\n%05g |", [integer[i]]]; to.PutF[" %05g", [cardinal[ct[i]]]]; ENDLOOP; to.PutF["%l\n", [rope["F"]] ]; }; ListPrint: PROC [to: IO.STREAM, ct: CardTable] = { first: BOOL _ TRUE; FOR i: NAT IN [0 .. ct.length) DO IF first THEN first _ FALSE ELSE to.PutRope[", "]; to.PutF[" %05g", [cardinal[ct[i]]] ]; ENDLOOP; first _ first; }; END. >Priming.mesa Spreitzer, November 3, 1985 6:13:39 pm PST Κ– "cedar" style˜codešœ ™ K™*—K˜šΟk œœ˜ K˜—šΠbxœœ˜Kšœ˜ K˜—K˜Kš˜K˜Kšœ œœ˜'šœœœ˜!Kšœœ˜Kšœœœœ˜%Kšœ˜—K˜šΟnœœ œœ˜;Kšœ œ˜Kšœ œœ˜Kšœœ˜"K˜K˜ K˜ š˜K˜Kš œ œœ œœ˜IKšœœœ˜šœœœ˜!Kšœ œ œœ˜*Kšœ˜—Kšœ˜Kšœ˜š˜Kšœœ˜ —K˜šœ œ œ˜!Kš œœœœœ˜+Kšœ˜Kšœ˜—Kš˜—K˜—K˜š Ÿœœœ œœ˜]Kšœœ ˜Kšœœ ˜)K˜šœœœ˜"šœœ˜K˜K˜K˜K˜—Kšœ˜—K˜ K˜—K˜š Ÿ œœœ œ œ˜cKšœœ ˜Kšœœ ˜)K˜š œœ œœ˜-šœœ˜K˜K˜K˜K˜—Kšœ˜—K˜ K˜—K˜šŸœœ˜(šœœœ˜#Kšœœ˜Kšœœ#˜.Kšœ˜—K˜—K˜š Ÿ œœœœœ˜@K˜%Kš œœœœ œ˜EK˜Kš œœœœœ˜;šœœœ˜!Kšœœ œ#˜:K˜$Kšœ˜—K˜K˜—K˜šŸ œœœœ˜2Kšœœœ˜šœœœ˜!Kšœœ œœ˜2K˜%Kšœ˜—K˜K˜—K˜Kšœ˜—…—θ '