Next: Grammar for types, Previous: Variables declaration, Up: Translating C into L
Type declaration (typedef
in C) are written as follows:
type Toto = struct { Int foo; Int baz;};
L's convention for types is that they should be capitalized, and if you have an identifiers that spans over several words, separate them by underscores and capitalize each word, Like_That.
But this is is really just a convention; your own program can be written as you like.
The type =
declaration isn't like typedef
, because it
introduces a new type that is incompatible with the first. (COMMENT :
the = is maybe misleading in that case?)
If you write, for instance:
type Kelvin = Float;
then you cannot have:
let Kelvin k = 3.0;
You have to do this instead: (UNIMPLEMENTED: does not work for now, explicit casts needed)
let Kelvin k = Kelvin(3.0);
or simply:
let k = Kelvin(3.0);
Similarly, the +
operations work on Int
s, and because
Kelvin
s are not Int
s, you cannot add Kelvin
s.
L provides a shortcut (UNIMPLEMENTED) for specifying which operations are still allowed for the new type:
type Kelvin = Float | allows +,-;
Forbiding *
is interesting for instance, because multiplying
Kelvins between them make no sense. Multiplying them by a Float makes
sense, however. (UNIMPLEMENTED: so we need a way to tell that).
Finally, writing all this can be factorized to:
import std.unit; type Kelvin = Float : unit;
unit
declares a type that does all this (in fact, that respects
the unit
interface). numeric
declares a type that has
+
, -
, *
, /
. All these are in fact type
classes, see Type classes.
If you just want something similar to C typedef
, you can use
L's typealias
:
typealias Floating_Point = Float; typealias Integer = Int;
defines Integer as an alias for Int. (i.e. they are the same type with just different names.)