Working through The Structure and Interpretation of Computer Programs