The standard library provides a convenient alias:
val x1 : complex[float] = fcomplex(2.2f, 1.0f);
which corresponds to std::complex. However this alias cannot
be used as the name of a constructor:
complex[float] (2.2f, 1.0f)
gives an error. Constructors CAN be polymorphic:
ctor int[t in ints] : t = "(int)$1";
but the type variables are only allowed for the arguments,
not the result type. In fact the syntax above was changed recently
by me, probably incorrectly, from:
ctor [t in ints] int : t = "(int)$1";
which is required for class constructors. These kinds of
constructors are really just hacks for functions otherwise
declared as
fun _ctor_int ...
However, for polymorphic constructors we'd need:
ctor [r in ints, t in ints] integer[r] : t = "(?2)$1";
Here the name of the function is
_ctor_integer
and it is polymorphic in r and t. Since r cannot be deduced in this
case it would have to be specified, and we'd like
integer[long] 1
to work, with t = int and r = long .. after all, C++ allows polymorphic
classes .. :)
When the lookup routine finds a type name when it expects a function,
it looks up _ctor_<name> instead, except if the type is a struct,
in which case a compiler generated constructor is used. Note the lookup
is name based: you can provide distinct constructors for the same type
simply by making a typedef:
typedef polar = dcomplex;
ctor polar : double * double = ...
Anyhow, it would be nice if polymorphic constructors worked:
I hate saying 'fcomplex' where 'complex[float]' should work,
this makes the language look non-orthogonal.
--
John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: http://felix.sf.net
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language