Classes

### 1.Class definition

User classes can be defined within Mmx-light, as shown in the following example:

 `Mmx]  ` `type_mode? := true`

:

 `Mmx]  ` ```class Color == { mutable { r: Double; g: Double; b: Double; } constructor grey (x: Double) == { r == x; g == x; b == x; } constructor rgb (r2: Double, g2: Double, b2: Double) == { r == r2; g == g2; b == b2; } }```
 `Mmx]  ` `rgb (1, 0, 0)`

:

 `Mmx]  ` ```flatten (c: Color): Syntactic == syntactic ('rgb (as_generic flatten c.r, as_generic flatten c.g, as_generic flatten c.b));```
 `Mmx]  ` `rgb (1, 0, 0)`

:

 `Mmx]  ` ```mix (c1: Color, c2: Color, a: Double): Color == rgb (a * c1.r + (1-a) * c2.r, a * c1.g + (1-a) * c2.g, a * c1.b + (1-a) * c2.b);```
 `Mmx]  ` `mix (rgb (1, 0, 0), grey (0.5), 0.5)`

:

### 2.Type conversions

The operator :> can be used to convert a given type into another, provided that the corresponding function downgrade is defined. We show here an example of an explicit conversion from a class Alpha_color to the class Color:

 `Mmx]  ` ```class Alpha_color == { mutable { c: Color; a: Double; } constructor alpha_color (c2: Color, a2: Double) == { c == c2; a == a2; } };```
 `Mmx]  ` `alpha_color (rgb(0,0,1), 0.5)`

:

 `Mmx]  ` `downgrade (ac: Alpha_color): Color == mix (ac.c, rgb(1,1,1), ac.a);`
 `Mmx]  ` `alpha_color (rgb(0,0,0), 0.6) :> Color`

:

In order to define implicit conversions from a type into another, one can use the function updgrade. We complete the example with a convert from Double to Color:

 `Mmx]  ` `upgrade (x: Double): Color == grey x;`
 `Mmx]  ` `mix (1.0, rgb (0, 1, 0), 0.2)`

:

 `Mmx]  ` `mix (0.8, 0.2, 0.4)`

:

 `Mmx]  ` `postfix .greyed (c: Color): Color == (c.r + c.g + c.b) / 3;`
 `Mmx]  ` `rgb (1, 0, 0).greyed`

:

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License. If you don't have this file, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.