<> <> 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.