CS2500 Lab 7: Abstraction and natural number recursion

Abstraction

Sometimes when we solve problems, we find that the solution to one problem
looks a lot like the solution to another one. Check out the following functions
and data definition. From now on we will leave out the definition for lists,
and use the [listof X] notation.

In the following exercises we will redefine some built-in arithmetic
functions to get practice writing recursive functions over Nats, so don't simply reuse the built-in functions.

Design a function nat-even? that returns true if the given Nat is even.

You may only use sub1 (and possibly not). E.g., do not use even?, odd?, modulo, etc.

Design a function double that doubles the given Nat. Again, you may only use add1 and sub1 (and double of course).

Design a function down-from that takes a Natn and returns the list of Nats counting down from n. For
example, (down-from3)
= (list3210).

Design a function repeat that takes a Natn and a Strings and returns a list that
repeats sn times. For
example, (repeat"buffalo"8) = (list"buffalo""buffalo""buffalo""buffalo""buffalo""buffalo""buffalo""buffalo"). Do not use make-list! (though it's good to know about)

Design a function nat+ that takes two Nats and computes their sum. (Use recursion, not the
built-in + function.)

Design a function nat* that takes two Nats and computes their product. (Again use recursion, not
the built-in * function, though you may use your nat+ now.)

Challenge: Design a function sqware that squares the given Nat (Note the intended name misspelling!), WITHOUT using nat*! You may use add1, sub1, double, and nat+ (and sqware of course).

Concentric rings in the World

In this animation, a World is a collection of Rings, each of which has a
size and a location.

; A World is a [listof Ring]; A Ring is a (make-ring Nat Posn)
(define-structring (sizecenter))

Design a grow-ring function that increases a Ring's size by 1.

Design a little draw-ring function that takes a Natr as input and simply returns
an image of a circle with radius r. (We'll make this
more interesting later.)

Design a place-ring function that draws a Ring into the given Scene at the
Ring's location. (Use draw-ring here so that we can modify it later to change the
animation.)

Design a draw function that renders a World as a Scene by drawing all the
Rings in their correct locations.

Design a mouse function that, when the mouse is
clicked, adds a 0-size Ring to the World at the location of the click.

Design a tick function that grows all the Rings in the World using grow-ring.

Put it all together and see what you get:

(big-bangempty
(on-ticktick.25)
(to-drawdraw)
(on-mousemouse))

Now let's redesign the draw-ring : Nat -> Image
function. Instead of making an image of a solid circle, let's make concentric
rings of many circles. We can achieve this by overlaying many circles of
increasing sizes: