Prof. Dr. Theo D'Hondt
Last revision: August 7th, 1996

Agora-S : Differences with Agora94 and Agora96

The major differences between Agora-S and Agora94/96 are summarised below.
The purpose of Agora-S was to build a programming language entirely based on pure objects together with message passing and no other features like inheritance, classes or whatever. Agora-S is the closest we got until now.

Hence, Agora-S was more ment to be 'a running calculus' rather than a programming language. Its major purpose is to experiment about how far one can go with 'pure objects and message passing' as the only language features. A comparison with lambda-calculus and 'pure functional Scheme' is easily made.

Agora94 and Agora96 on the other hand contain much more 'syntax' (i.e. reifiers) than Agora-S. Seen from a programming language design angle, the most important difference is that Agora94 and Agora96 contain explicit mixin methods which are defined by adding the adjective 'mixin' to a method declaration. Agora-S, on the other hand, has no mixin methods. Instead it defines ordinary methods whose invocation will temporarily extend the receiver with things like variables local to the method. But of course, we would not want the receiving object to be destructively extended with these local variables, each time a method is invoked. Therefore, we have adopted the following solution in Agora-S: every method declaration should be annotated by a name for its receiver. Accessing this name means accessing the receiver before it was extended with the method's locals. Consider the following example:

self do:with method: [ ..... me perform:with method: [ .... ]]
In the outer method, the receiver is called 'self'. In the nested method, the receiver is called 'me'. A self send in the outer method would be done to 'self' while a self send in the inner method is done to 'me'. This way, the self send is done to the real receiver, and not to the receiver that is currently extended with the locals of the method. However, sometimes, it is precisely this extended receiver that is needed. This is particularly true if we want a method to behave like a mixin method. In order to be able to acces the 'temporarily' extended receiver, the meta-variable µself is provided.

A remarkable thing is that with the setup of Agora-S, many 'super' sends are no longer needed. A super send is accomplished by sending something to one of the 'self' receivers that are lexically seen. In the above example, the inner method can do a super send by adressing 'self'.

A calculus has been designed (OPUS tng) that is very similar to Agora-S. It is remarkable that the calculus resulted from a totally different research track ("let's make a calculus that is very flexible in use and still obeys the principles outlined in [Steyaert et al. 95]"). Hence, for the moment, Agora-S is about the limit of flexibility one can get when boldly following the principles of "only pure objects and message passing". We are still researching whether this is correct.

Investigating these boundaries has much to do with introducing modularity (i.e. modules) and separate compilation in Agora.