 For something slightly more interesting, we'll solve the fizz-buzz problem. The fizz-buzz problem, if you're not familiar, is a basic test of rudimentary programming knowledge. The fizz-buzz program, as usually prescribed, is supposed to print the numbers from 1 up to 100, but for numbers which are evenly divisible by 3, we should instead print fizz. For numbers which are evenly divisible by 5, we should instead print buzz. And for numbers which are evenly divisible by both 3 and 5, we should print fizz-buzz. In all other cases, we just print the number itself. So you'll see printed 1, then 2, then fizz, then 4, then buzz, then fizz, because 6 is evenly divisible by 3, then 7, then 8, then fizz, because 9 is evenly divisible by 3, and then buzz, because 10 is evenly divisible by 5, and then so forth, all the way up to 100. So to solve the problem, first of course, we obviously need a loop, because we're going to be iterating over the integers from 1 up to and including 100. And so, in our fizz-buzz function here, we have this loop in which i is bound in the first iteration, the value 1, and then we have a test if i is less than or equal to 100. Then we do the business of the loop, and at the end, we invoke recur to do another iteration in which i is incremented by 1. So ignoring that big if expression and all that complex business there, ignoring that part, the skeleton of the function is just this loop that starts out at 1, iterates to 2, then 3, then 4, then 5, and so forth, all the way up to and including 100, and then pass that at 101, the if tests false, and so we don't call recur again, and that's the end of the function. And the function actually will then return nil, because the if form has no third expression, and so it defaults to nil, it'll then return nil. The loop in turn will return nil, and so the function will return nil. This function clearly is meant to be impure, it's a function to produce side effects, it's not supposed to return a value really, so it's fine that it returns nil. In any case, so looking at the complex business, notice that in our if we're using a do form because we want to do this if business, this printing business, and then we're going to do the recur. That's why we need a do form, because the if form is expecting one expression, but we want to do two things in succession, that's why we need a do form. So we already explained the recur part, but looking at the if, that effectively what you see there is an if else ladder. It looks a little strange, because you're used to seeing the clauses of the if else ladder lined up at the same margin, but here each time we're indenting in by one extra level. But anyway, starting at the first if, we have that condition, which is a call to and, and is a standard library function, which returns true when all of its arguments are true, otherwise it returns false. Inside the ant, we have two equality tests with the equal sign. And then inside the equality tests, we are using the REM function, which is short for remainder. So REM i3 returns the remainder of division of i divided by three. So this equality test tests whether or not the remainder of i divided by three is equal to zero. And likewise, the second equality test is testing whether the remainder of i divided by five is equal to zero. And so if both of those things are true, we're going to invoke print line with the argument fizz buzz. Otherwise, we're going to go on to this other if, and we're going to test whether or not i just by itself is evenly divisible by three. So we're going to call remainder of i and three and test whether that result is equal to zero. And if so, then we invoke print line with the argument fizz. Otherwise, we go to the last if where the condition tests whether or not i is evenly divisible by five. And if so, then we print line buzz. But if that condition tests false, then we go to the default and we print just i, the integer number itself. So we have these four exclusive cases effectively. There's the one case where i is evenly divisible by both three and five, in which case we print fizz buzz. Then we test whether or not i is just evenly divisible by three, in which case we print fizz. Then there's the case i is evenly divisible by five, in which case we print buzz. And then we have our default case where none of those are true, in which case we just print the number i itself. There's one other way of expressing this logic that uses a macro called conned, which I believe is short for conditions or conditional or something like that. In any case, conned is basically the macro form of an if else ladder. In the conned form, you have any number of pairs of conditions with expressions, such that the conditions are tested top to bottom. And the first one that's true, its expression is executed and the whole rest of the conned is skipped over, just like an if else ladder. So here we have a conned where the first condition is that and test, testing whether the remainder of i divided by three is equal to zero and i divided by five is equal to zero. And if so, then we print line fizz buzz and skip over everything else. But if it's not true, then we go into the next condition, which is an equality test of ram i three zero. And if that's true, then we print line fizz. Otherwise we go into the next condition of equal sign ram i five zero. And if that's true, then we print line buzz. And then finally we get to a default case here denoted with the keyword else, in which case we just print line i. We actually really don't need this keyword else syntax. We could just simply have a condition true, and that would serve just as well as the default. But the con form lets you put this else keyword here just to make the intent clearer. We don't really need it. It just kind of looks better.