DIRECTORY IPReal USING [], Real USING [Fix, RealException]; IPRealImpl: CEDAR PROGRAM IMPORTS Real EXPORTS IPReal = BEGIN Fix: PRIVATE PROC[r: REAL] RETURNS[INT] = { RETURN[Real.Fix[r]] }; Floor: PUBLIC PROC[a: REAL] RETURNS[c: REAL] = { c _ Fix[a ! Real.RealException => { c _ a; CONTINUE }]; IF c>a THEN RETURN[c-1] ELSE RETURN[c] }; Ceiling: PUBLIC PROC[a: REAL] RETURNS[c: REAL] = { c _ Fix[a ! Real.RealException => { c _ a; CONTINUE }]; IF c { c _ a; CONTINUE }]; RETURN[c] }; Round: PUBLIC PROC[a: REAL] RETURNS[c: REAL] = { RETURN[Floor[a + 0.5]] }; Mod: PUBLIC PROC[a, b: REAL] RETURNS[REAL] = { RETURN[a - b*Floor[a/b]] }; Rem: PUBLIC PROC[a, b: REAL] RETURNS[REAL] = { RETURN[a - b*Trunc[a/b]] }; END. ªIPRealImpl.mesa Last edited by: Doug Wyatt, February 11, 1984 4:26:39 pm PST This procedure copes with a "feature" of Mesa's signal handling. Because Real.Fix actually compiles into machine code, any signal it raises cannot be caught in the statement that invokes it; the catch phrase must be at least one procedure call away. To fix a real number and catch any exception, say Fix[r ! Real.RealException => GOTO Fail]; ʘJšœ™šœ™Jšœ,™,—J˜šÏk ˜ Jšœœ˜Jšœœ˜ —J˜Jšœ œ˜Jšœ˜ Jšœ˜Jšœ˜J˜šÏnœœœœœœœ˜BJšœÕ™Õ—J˜š žœœœœœœ˜0Jšœ+œ˜7Jš œœœœœ˜&J˜—J˜š žœœœœœœ˜2Jšœ+œ˜7Jš œœœœœ˜&J˜—J˜š žœœœœœœ˜0Jšœ+œ˜7Jšœ˜ J˜—J˜š žœœœœœœ˜0Jšœ˜J˜—J˜š žœœœœœœ˜.Jšœ˜J˜—J˜š žœœœœœœ˜.Jšœ˜J˜—J˜Jšœ˜—…—Lü