1.Class definition
User classes can be defined within Mmx-light, as
shown in the following example:
:
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] |
flatten (c: Color): Syntactic ==
syntactic ('rgb (as_generic flatten c.r,
as_generic flatten c.g,
as_generic flatten c.b)); |
:
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] |
postfix .greyed (c: Color): Color == (c.r + c.g + c.b) / 3; |
Mmx] |
rgb (1, 0, 0).greyed |
:
© 2010–2012 Joris van der Hoven, Grégoire Lecerf,
Bernard Mourrain
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.