Wolfgang De Meuter
Last revision: August 7th, 1996

MiniMix : A Denotational Toy Variant of Agora


MiniMix MiniMix is a small toy language which was created to support our paper at ECOOP95. MiniMix can be regarded as a tiny version of our Agora language. It's main purpose is to make our original inheritance model clear. Nevertheless, it is possible to write real programs in MiniMix, especially if they are functional in nature. MiniMix has no state, no private stuff, no multiple inheritance ... and so on. It is however a very good approximation of 'the heart of Agora'. A short description of MiniMix follows. It's Scheme-implementation is available by anonymous FTP. A Gofer implementation is available too.

MiniMix Syntactic domains and their typical elements

	I in Ident,	{ identifiers }

OE in ObjExpr, { object expressions }

B in Basic, { basic objects }

ME in Msg, { message expressions }

P in Program, { programs }

AB in Abstr, { abstractions }

AD in AttDec { attribute declarations }

MiniMix Syntax Definition

	P -> OE
	OE -> ME | I | B | "self" | "super" | "object" AB
	ME -> "send" OE1 I "(" OE2 ")"
	AB -> "[" AD "]"
	AD -> "method" I1 "(" I2 ")" OE | "mixin" I1  "(" I2 ")" AB | AD1 ";" AD2

MiniMix Semantic domains

	Object		= Ident -> Attribute
	Attribute	= Object -> Object
	Generator	= Generator -> Object
	Wrapper		= Object -> Generator 
	Env		= Ident -> Object

MiniMix Semantic Functions

_P_ : Program -> Object

_B_ : Basic -> Object

_OE_ : ObjExpr -> Env -> Object -> Generator -> Object

_ME_ : Msg -> Env -> Object -> Generator -> Object

_AB_ : Abstr -> Env -> Wrapper

_AD_ : AttDec -> Env -> Object -> Generator -> Object

MiniMix Semantic clauses

_P_[ OE ] = Wrap( _OE_[ OE ] bot bot)

_OE_[ ME ] = \e.\p.\g._ME_[ ME ] e p g

_OE_[ I ] = \e.\p.\g.(e I)

_OE_[ B ] = \e.\p.\g._B_[ B ]

_OE_[ self ] = \e.\p.\g.(Wrap g)

_OE_[ super ] = \e.\p.\g.p

_OE_[ object AB ] = \e.\p.\g.(Wrap ( _AB_[ AB ] e bot bot))

_ME_[ send OE1 I ( OE2 ) ] = \e.\p.\s.((_OE_[ OE1 ] e p g) I ) (_OE_[ OE2 ] e p g) _AB_[ [ AD ] ] = \e.(_AD_[AD] e) _AD_[ AD1 ; AD2 ] = \e.\p.\g.(_AD_[ AD1 ] e p g) +r (_AD_[ AD2 ] e p g) _AD_[ method I1 ( I2 ) OE ] = \e.\p.\g.[ I1->\o._OE_[OE] e[I2/o] p g ] _AD_[ mixin I1 ( I2 ) AB ] = \e.\p.\g.[I1->\o.(Wrap(Inherit g (_AB_[ AB ] e[I2/o])))]