It may not be obvious that this loop is necessarily infinite given the nonuniform occurrences of prime numbers. The starting point for a proof that it is in fact infinite is Bertrand's postulate, which says for any
100
This is for illustrative purposes only—obviously, writing test cases for built-in functions such as +
is a bit silly, since if such basic things aren't working, the chances the tests will be running the way you expect is pretty slim. On the other hand, most Common Lisps are implemented largely in Common Lisp, so it's not crazy to imagine writing test suites in Common Lisp to test the standard library functions.
101
Side effects can include such things as signaling errors; I'll discuss Common Lisp's error handling system in Chapter 19. You may, after reading that chapter, want to think about how to incorporate tests that check whether a function does or does not signal a particular error in certain situations.
102
I'll discuss this and other FORMAT
directives in more detail in Chapter 18.
103
If test-+
has been compiled—which may happen implicitly in certain Lisp implementations— you may need to reevaluate the definition of test-+
to get the changed definition of check
to affect the behavior of test-+
. Interpreted code, on the other hand, typically expands macros anew each time the code is interpreted, allowing the effects of macro redefinitions to be seen immediately.
104
You have to change the test to make it fail since you can't change the behavior of +
.
105
Though, again, if the test functions have been compiled, you'll have to recompile them after changing the macro.
106
As you'll see in Chapter 12, APPEND
ing to the end of a list isn't the most efficient way to build a list. But for now this is sufficient—as long as the test hierarchies aren't too deep, it should be fine. And if it becomes a problem, all you'll have to do is change the definition of deftest
.
107
Fred Brooks,
108
Mattel's Teen Talk Barbie
109
Obviously, the size of a number that can be represented on a computer with finite memory is still limited in practice; furthermore, the actual representation of
110
Folks interested in using Common Lisp for intensive numeric computation should note that a naive comparison of the performance of numeric code in Common Lisp and languages such as C or FORTRAN will probably show Common Lisp to be much slower. This is because something as simple as (+ a b)
in Common Lisp is doing a lot more than the seemingly equivalent a + b
in one of those languages. Because of Lisp's dynamic typing and support for things such as arbitrary precision rationals and complex numbers, a seemingly simple addition is doing a lot more than an addition of two numbers that are known to be represented