SICP 2.4.3 Exercises
May 16, 2015 11:35
Now that we’ve developed the abstract system through several sections, we come to more formalized methods of abstracting an interface. The approaches used here are data-directed and message-passing. While these terms themselves don’t see broad usage, the concepts are both used in many modern programming styles and languages. The overarching concept is that of polymorphism. The idea is that the interface may connect to a variety of underlying data ‘types’, and what actually occurs during the operation may depend on how that type is implemented.
In order to actually program with the data-directed approach used in the text, we require some sort of table implementation. As the text mentions, the table relies on a concept that won’t be introduced until the next chapter. I have a library file ‘data-tables.scm’ that handles this. As it incorporates concepts not yet touched on, it’s provided without additional explanation. I will also mention that this also marks a point where Racket departs a bit from Scheme, and thus there is a different file that is Racket-specific. (The difference is not a major one, but is directly related to those not-yet-introduced concepts.) The tables can be used with the
get as defined within the exercise file, which function in the same way the book defines them.
As for testing, only one exercise deals with the complex numbers, and the other exercises are a bit more open-ended. For the first, we can continue to use the same complex number test file, since the interface remains consistent. For testing the derivative system, a similar observation can be made as in Section 2.3.2 — it is difficult to get results in a consistent format. The results are checked by displaying them and we rely on manual inspection, although for a few of them specific tests could be written.
Exercise 2.74 is very open-ended and even a little vague. It asks questions about what information might be required of a system that we do not have an example of. To this end, I’ve created two alternate approaches that can be tested against your methods of retrieval, and some suggestions on a few tests to try. Since this is an exercise about trying to work with an existing codebase, it might require a bit more work to understand, but can be considered a good practical exercise in trying to comprehend someone else’s code.