record Range(a, b) # note, we force 'n' to be real, which means recalculation will # be using real numbers, not integers procedure remap (range1, range2, n : real) if n < range2.a | n > range2.b then fail # n out of given range return range1.a + (n - range2.a) * (range1.b - range1.a) / (range2.b - range2.a) end procedure range_string (range) return "[" || range.a || ", " || range.b || "]" end procedure main () range1 := Range (0, 10) range2 := Range (-1, 0) # if i is out of range1, then 'remap' fails, so only valid changes are written every i := -2 to 12 do { if m := remap (range2, range1, i) then write ("Value " || i || " in " || range_string (range1) || " maps to " || m || " in " || range_string (range2)) } end