To invoke a method of a TOM object, use the TRT_SEND macro. For
example, to retrieve the length of an array a:
tom_object a = ...; tom_int len = TRT_SEND (, a, SEL (i_length));
The second argument to TRT_SEND is the receiver of the message.
The third argument is the selector to be sent. A selector is an
invocation of the SEL macro, with as argument the selector's name
(see section Selectors) with any nasty characters replaced by an underscore.
A more elborate example shows almost all pitfalls when using
TRT_SEND. In this example the method (int, float) split
float f is invoked, which in TOM would be written as
SomeClass receiver = ...; float fractional, number = ...; int integer; (integer, fractional) = [receiver split number]
is invoked from C as follows:
tom_object receiver = ...;
tom_float fractional, number = ...;
tom_int integer;
integer = TRT_SEND ((tom_int (*) (tom_object, selector,
tom_float, tom_float *)),
receiver, SEL (_if__split_f), number, &fractional);
The first argument to TRT_SEND is a cast to the type of the
function actually being invoked. This cast is mandatory if the return
type of the function (implementing the method) invoked is not a
tom_int. The argument prototypes in the cast are mandatory when
needed to prevent the C compiler from doing undesirable type conversions
due to it not having seen a full prototype of the function being
invoked. For instance, usually, tom_float is simply a
float, which the compiler will `upgrade' to a double when
passed as an argument for which the prototype has not been seen.
This example also shows that for a method returning a tuple, the first element of the tuple (or the first element thereof in case it is a tuple too (or...)) is actually returned from the C function implementation, and any remaining elements of the tuple returned are stored in variables the address' of which has been passed as `invisible' trailing arguments.
Go to the first, previous, next, last section, table of contents.