The first challenge that I faced in translating the examples of Practical Python Programming - 1.3 Numbers was the differences in the number type systems between Python and Racket.
Python has a flat number type system with four types: booleans, integers, floating point and complex (imaginary numbers).
Racket has a heirarchical number type system. There are two main branches in the heirarchy, exact and inexact. This is a somewhat simplified view of the Racket number type hierarchy:
integer e.g. 10 - like a Python integer
rational e.g. 1/2
complex e.g. 1 + 2i
real e.g. 2.0 - like a Python floating point
complex e.g. 2.1 + 3.3i
Racket also has two specialists number types, flonum (floating point) and fixnum (integer), that are used when there is a need for improved performance. These have their own maths operators. (I haven't looked into them any further at this stage.)
When "translating" the Python code, I have equated its integer with Racket's exact and its floating point with Racket's inexact.
The second came from Python's boolean type. It's a very raw C-language type with very few barriers to how a programmer can use it. For all I know, Racket's boolean type may similarly be implemented using integers. However, as far as the Racket programmer is concerned, it supports only two values: true and false.
I didn't want my script to just raise an error and stop when I tried to add a number to a boolean. After searching the docs and a little trial and error, I worked out how to trap an error:
(racket '(define c 4))
(racket "(+ c true)")
(expect "Contract violation")
(displayln "Contract Violation"))])
(+ c true))
The third was tame in comparison, working out how to convert an inexact float to an exact integer. I came up with using:
(inexact->exact (floor my-float-value))
Take a look at the numbers.rkt script, then run it either in Dr Racket or the Racket repl. Do the result make sense?
Next up - Exercise 1.7 Mortgage