DIRECTORY IPBasic USING [Any, Identifier, Integer, maxInteger, Number, Operator, Vector, zero], IPConvert USING [IntegerToReal, NumberToInteger, NumberToReal], IPErrors USING [MasterError, MasterWarning], Real USING [Fix, RealException]; IPConvertImpl: CEDAR PROGRAM IMPORTS IPConvert, IPErrors, Real EXPORTS IPConvert = BEGIN OPEN IPConvert, IPBasic; RealToInteger: PUBLIC PROC[r: REAL] RETURNS[Integer] = { Fix: PROC[r: REAL] RETURNS[INT] = { RETURN[Real.Fix[r]] }; i: INT = Fix[r ! Real.RealException => GOTO Fail]; IF i IN[0..maxInteger] AND i=r THEN RETURN[i] ELSE GOTO Fail; EXITS Fail => ERROR IPErrors.MasterError[NarrowFailed]; }; AnyToNumber: PUBLIC PROC[x: Any] RETURNS[Number] = { IF x.type=number THEN RETURN[x.number] ELSE IF x.type=nil THEN { SIGNAL IPErrors.MasterWarning[NullValue]; RETURN[zero] } ELSE ERROR IPErrors.MasterError[WrongType]; }; AnyToReal: PUBLIC PROC[x: Any] RETURNS[REAL] = { IF x.type=number THEN RETURN[NumberToReal[x.number]] ELSE IF x.type=nil THEN { SIGNAL IPErrors.MasterWarning[NullValue]; RETURN[0] } ELSE ERROR IPErrors.MasterError[WrongType]; }; AnyToInteger: PUBLIC PROC[x: Any] RETURNS[Integer] = { IF x.type=number THEN RETURN[NumberToInteger[x.number]] ELSE IF x.type=nil THEN { SIGNAL IPErrors.MasterWarning[$NullValue]; RETURN[0] } ELSE ERROR IPErrors.MasterError[WrongType]; }; AnyToIdentifier: PUBLIC PROC[x: Any] RETURNS[Identifier] = { IF x.type=identifier THEN RETURN[NARROW[x.ref]] ELSE ERROR IPErrors.MasterError[WrongType]; }; AnyToVector: PUBLIC PROC[x: Any] RETURNS[Vector] = { IF x.type=vector THEN RETURN[x.ref] ELSE ERROR IPErrors.MasterError[WrongType]; }; AnyToOperator: PUBLIC PROC[x: Any] RETURNS[Operator] = { IF x.type=operator THEN RETURN[NARROW[x.ref]] ELSE ERROR IPErrors.MasterError[WrongType]; }; NumberToAny: PUBLIC PROC[x: Number] RETURNS[Any] = { RETURN[[type: number, number: x]]; }; RealToAny: PUBLIC PROC[x: REAL] RETURNS[Any] = { RETURN[[type: number, number: [real[x]]]]; }; IntegerToAny: PUBLIC PROC[x: Integer] RETURNS[Any] = { RETURN[[type: number, number: [int[x]]]]; }; IdentifierToAny: PUBLIC PROC[x: Identifier] RETURNS[Any] = { RETURN[[type: identifier, ref: x]]; }; VectorToAny: PUBLIC PROC[x: Vector] RETURNS[Any] = { RETURN[[type: vector, ref: x]]; }; OperatorToAny: PUBLIC PROC[x: Operator] RETURNS[Any] = { RETURN[[type: operator, ref: x]]; }; END. ’IPConvertImpl.mesa Last edited by: Doug Wyatt, April 29, 1983 2:17 pm Wrap a procedure call around Real.Fix so we can catch RealException ΚΕ˜headšœ™šœ™Jšœ"™"—J˜šΟk ˜ JšœœH˜UJšœ œ0˜?Jšœ œ˜,Jšœœ˜ —J˜—šœœ˜Jšœ˜!Jšœ ˜Jšœœœ˜ J™š Οn œœœœœ ˜8š žœœœœœœ˜:JšœC™C—Jšœœ!œ˜2Jšœœœœœœœ˜=Jšœ œ$˜7J˜—J˜šž œœœ œ ˜4Jšœœœ ˜&Jš œœ œœ$œ˜RJšœœ!˜+J˜—š ž œœœ œœ˜0Jšœœœ˜4Jš œœ œœ$œ˜OJšœœ!˜+J˜—šž œœœ œ ˜6Jšœœœ˜7Jš œœ œœ%œ˜PJšœœ!˜+J˜—šžœœœ œ˜