Structure and Interpretation Of Computer Programs, Second Edition by Harold Abelson