The way we're having people take food from restaurants is unrealistic in several ways. Our overall goal this week is to fix that. As a first step, you are going to create a
food class. We will give things that are food two properties, an
edible? property and a
edible? will have the value
#t if the object is a food. If a
person eats some
calories are added to the person's
(Remember that the
edible? property will automatically be
false for objects other than food, because of the way properties were implemented in Question B4. You don't have to go around telling all the other stuff not to be edible explicitly.)
Write a definition of the
food class that uses
thing as the parent class. It should return
#t when you send it an
edible? message, and it should correctly respond to a
Replace the procedure named
edible? in the original
adv.scm with a new version that takes advantage of the mechanism you've created, instead of relying on a built-in list of types of food.
> (define pesto-pasta (instantiate food 'pasta 150)) ;name is pesto-pasta, calories is 150 > (ask pesto-pasta 'calories) 150 > (ask pesto-pasta 'edible?) #t > (edible? pesto-pasta) #t
Now that you have the
food class, invent some child classes for particular kinds of food. For example, make a
pasta class that inherits from
pasta should not have any instantiation variable. Give the
pasta a class-variable called
name whose value is the word pasta. (We'll need this later when we invent
Using your pasta class, it should now be possible to instantiate the pesto-pasta above as follows.
> (define pesto-pasta (instantiate pasta)) > (ask pesto-pasta 'calories) 150
eat method for people. Your
eat method should look at your possessions and filter for all the ones that are edible. It should then add the
calories value of the foods to your
strength. Then it should make the foods disappear (no longer be your possessions and no longer be at your location).
Before moving on, get your partner to explain Question A6 and its solution. Also, explain Question B6 and its solution to your partner.
Your job is to define the
police class. When the police notices a new person entering where he is, the police checks to see if that person is a thief. If the person is a thief the police says "Crime Does Not Pay," then takes away all the thief's possessions and sends the thief directly to jail.
Give thieves and police default strengths. Thieves should start out stronger than persons, but police should be stronger than thieves. Of course, if you eat lots you should be able to build up enough
strength to take food away from a thief.
Please test your code and turn in a transcript that shows the thief stealing your food, you chasing the thief and the police catching the thief. In case you haven't noticed, we've put a thief in Sproul Plaza to help test your code.
> (define somepolice (instantiate police 'grammarpolice soda))
Now we want to reorganize
take so that it looks to see who previously possesses the desired object. If its possessor is
'no-one, go ahead and take it as always. Otherwise, invoke:
> (ask thing 'may-take? receiver)
may-take? method for a thing that belongs to someone should compare the strength of its owner with the strength of the requesting person to decide whether or not it can be taken. If the receiver has the same strength as the holder, the receiver may take the object. If the thing does not has a holder, the receiver may take the object.
The method should return
#f if the person may not take the thing, or the thing itself if the person may take it. This is a little more complicated than necessary right now, but we are planning ahead for a situation in which, for example, an object might want to make a clone of itself for a person to take.
Note the flurry of message-passing going on here. We send a message to the taker. It sends a message to the thing, which sends messages to two people to find out their strengths.