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.