Agora general information


Wolfgang De Meuter
Last revision: November 17th, 1997

Agora general information


Objects

Agora is a prototype-based (also often referred to as an object-based) language, which means that it has no classes. Instead, objects are created by 'just writing them down', by extending existing objects or by copying existing object (often called cloning). In Agora, everything is an object and the only thing one is allowed to do with an object is to send it a message.

Agora Syntax

Agora features two kinds of messages: ordinary messages like in Smalltalk and so called reifier messages. Reifier messages are consistently written boldfaced. Reifier messages are comparable to special forms in Scheme. Special forms like (if cond exp1 exp2) can be seen as 'special functions' whose arguments are not evaluated when the function is applied. It is the implementation of the if special form that will explicitely evaluate the arguments when needed. In Scheme there is no syntactical provision for special forms. Hence, when encountering a function application (f ...), the evaluator first checks whether f is a special form. If so, it invokes the special form. If not, the ordinary semantics for function application is used.
Reifier messages are like special forms. For example, an if-test in Agora is written as cond ifTrue:exp1 ifFalse:exp2. Unlike Scheme, Agora employs a special syntactical rule for it's 'special forms': all reifier messages are to be denoted boldfaced. When a message is not in bold, it is treated as an ordinary message. Otherwise, the message is sent to the unevaluated receiver (a syntax object) with the unevaluated expressions as arguments.

Just like the particular flavour of Scheme is determined by the set of special forms it defines, the entire language design of Agora lies in the implemented reifiers. For example,Agora94 , Agora96 and Agora98 implement different reifier messages.

Encapsulation and Message Passing

The only operation on objects is message passing. This is in sharp contrast to other prototype-based languages whose semantics requires delegation. Since Agora is solely based on message passing, it is a language with a very high degree of encapsulation. Nevertheless, Agora shows that even within such a restricted setup, features like inheritance, cloning and reflection are perfectly possible.

In Agora, inheritance is accomplished by mixin-methods. A mixin-method is like an ordinary method, but when it is invoked, the receiver of the message extends itself with the contents of the mixin-method. This can result in a functional extension of the receiver (a view) or a destructive extension of the receiving object.

Cloning an object is done by a cloning method. A cloning method is a method like any other method. But when it is invoked, the receiving object first copies its internal structures and then runs the cloning method in the context of the copy. We think that cloning methods can provide a solution for the prototype-corruption problem most prototype-based languages suffer from.

Reflection

Agora is a reflective language, which means that is possible to access the implementation of Agora from within the Agora language. Hence, the design of the implementation is very important as it is part of the definition of Agora. The most simple application of reflection in Agora is to write new reifier methods. This is like being able to add new special forms to Scheme. However, Agora goes further. Agora is a so called open implementation which means that the entire implementation is accessible and changeable from within Agora.

Implementations