While we’ve got a program that can accept commands and behave like a calculator, it is, at this point, somewhat brittle. Unexpected input can cause it to enter the Lisp debugger, which isn’t how we’d like to have things behave. So, it’s time to start making sure that bad input is handled gracefully.
We’ll define an error status region of the screen that will fill in with text when the calculator determines that an error has occurred. In that case, we’ll mark the stack with an error text and force the user to type the “clx” command before continuing. This means we have to add a new field to our keypress structure, “can clear errors”, so that we can make sure only that key can be used until the error has been cleared.
Now, in engine.lisp, we cheated a bit on the code that allows an entire number to be input at once. We used read-from-string on unsanitized input to see if the string contained a number. This can break in a variety of ways if the string contains, say, unbalanced double-quotes, to name only one of many bad cases. So, to clean it up, we do a pre-test to verify that the string contains only characters that are legal in a numeric context. That is, the digits, the dot, the minus sign, and ‘d’ or ‘e’ in either lower- or upper-case, for the exponential notation.
Here, then, is an example of what happens when the user tries to divide 1 by 0:
This code is checked into the git repository under the tag v2014-11-26.