Methods are functions that are directly associated with a class.
We will create a Lookup method for the
Catalog class. This method lets you look up an entry
in the catalog by a key associated with the entry. In this example we implement
our data as an association list, that is, a list whose elements are also lists,
each of which contains exactly two elements : key and value. The library
function assoc_equal
returns the remainder of the association list starting at the element whose key
coincides with the key in the argument of the method
Lookup. Thus, Lookup returns the list
associated with the key. The special keyword self is used
when the instance refers to itself within the function:
method Catalog.Lookup (key)
{
car(assoc_equal(key, self.data));
}
Note that the keyword self can be omitted and the call would
look as follows:
car(assoc_equal(key, .data));
The calls to class methods are made by instances, using the dot notation. For
example, the instance autoparts created above can call
the Lookup method as follows:
Gamma>autoparts.Lookup ("muffler");nil
Since the data attribute did not have a default value, the first time call to
Lookup returns nil. In order to put data in the data list,
we must create another method:
method Catalog.Add (key, value)
{
local i;
if (i = .Lookup (key))
{
princ("The entry ", key, " already exists\n");
nil;
}
else
{
.data = cons(list(key, value), .data);
}
}
Notice that the Add method is using
Lookup to determine whether or not the entry already
exists in the association list. If so, it returns nil. Otherwise the new entry is added to
the data list using the library function cons. The return value of a method is the
return value of the last function executed within the body of the method.
Now we can add some data. For example, we can add an entry with the keyword "muffler" and the value 1, which is, for example, the number of mufflers in the stock:
Gamma>autoparts.Add ("muffler", 1);(("muffler" 1))Gamma>autoparts.Add ("starter", 5);(("starter" 5) ("muffler" 1))
Now we can look up the entry for a muffler by the keyword:
Gamma>autoparts.Lookup("muffler");("muffler" 1)
Note that the autoparts instance variables can be queried
using the dot notation as follows:
Gamma>autoparts.data;(("starter" 5) ("muffler" 1))