(* I have to write the formula twice. A constraint system would avoid this, at the cost of a lot of complexity elsewhere. *) MODULE TempConv; IMPORT Texts, Oberon; VAR W: Texts.Writer; (* Scan both INTEGER and REAL numbers *) PROCEDURE ScanNum(): REAL; VAR result: REAL; S: Texts.Scanner; BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S); IF S.class = Texts.Int THEN result := FLT(S.i) ELSIF S.class = Texts.Real THEN result := S.x ELSE result := 0.0 END; RETURN result END ScanNum; PROCEDURE CToF*; VAR f: REAL; BEGIN f := ScanNum() * 9.0 / 5.0 + 32.0; Texts.WriteRealFix(W, f, 1, 1); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END CToF; PROCEDURE FToC*; VAR c: REAL; BEGIN c := (ScanNum() - 32.0) * 5.0 / 9.0; Texts.WriteRealFix(W, c, 1, 1); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf) END FToC; BEGIN Texts.OpenWriter(W) END TempConv.