On Wed, 2007-09-19 at 16:45 +1000, skaller wrote:

> Anyhow .. this CAN be done. 

And now has been:

/////////////////////////////////////
#import <flx.flxh>

var x = struct {a=1; b=2; };
println q"a=$(x.a), b=$(x.b)";
var y = (a=3, b=4);
println q"a=$(y.a), b=$(y.b)";

struct X { aa:int; bb:int; };

val k = X (1,2);
println q"aa=$(k.aa), bb=$(k.bb)";

val j = X (bb=11,aa=22);
println q"aa=$(j.aa), bb=$(j.bb)";

val r = (bb=88,aa=99);
val q = X r;
println q"aa=$(q.aa), bb=$(q.bb)";
///////////////////////////////////////////

I have NOT checked if this works right with
polymorphic structs. NOTE the last case: the record
doesn't have to be given literally!

BTW: BUG report:

        struct X { int a; int b; };

doesn't work! It should... (C syntax for component declarators .. )

Now .. whilst coding this I am thinking on this one:

        fun f(a:int, b:int) ..
        fun f(x:int, y:int)

        f(x=1, y=2) //calls the second b

Basically, the idea is a function can take either a tuple or
record argument, even if the argument is specified as above
(rather than as a record type).

Related to this .. if the function takes a struct X argument,
it can also accept a record, if and only if

        X r

is correct. For example:

        fun f(x:X)..
        f (a=1,y=2)

you could even argue

        f (1,2)

should work. Note these cases DEFEAT strict nominal typing
so it isn't clear they should be allowed, especially the
last on f (1,2). The f (a=1,y=2) is also not strict, however
it is stricter because at least the components match.

So bottom line, the case:

        f(x=1, y=2) //calls the second b

may be implementable. I think this would be done much like the 
implementation for struct init, only now we have a SET of functions.
This has to be done in overload resolution (which is the scariest
or second scariest routine in Felix compiler):

If a candidate fails to unify (try that first in case the function
was defined to accept a record), and the argument is a record,
then convert the argument to a tuple by name correlation with
the function parameter names, and try to match that.

This is how the struct init works. However in this case,
overload resolution returns a function, but we have to
make sure the generated application (or call) is applied
to the permuted tuple, eg:

        fun f(x:int, y:int)
        f (y=2,x=1) --->> f (1,2)

and not the original argument.

-- 
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
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to