On Thu, 2007-09-20 at 00:35 +1000, skaller wrote:
> On Wed, 2007-09-19 at 16:45 +1000, skaller wrote:

> 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

OK, I'm looking at this. Some things to note:

When a function is curried, the parameter names of the
second and subsequent arguments are lost.

For the first argument, it could be a record type.
In that case, there is a confusion:

        fun f(x:struct {a:int})
        f (a=1)
        f (x=(a=1))

Which is allowed? The first case works now, so it has
to be allowed: this is shorthand for

        f (struct {a=1;})

But the second case is just a special case where the argument
list is length 1, so the usual tuple degrades to a single argument.
This has the effect that for Felix functions (but NOT primitives!!)
we can write:

        f (x:int, y:int)

or

        f (xy: int * int)

and they have the same (domain) type, namely int * int, and
are called the same way (with positional arguments): 

        f (1,2)
        let ?xy = 1,2 in f xy

so it would be rather inconsistent to ban

        f (x=(a=1))

just because the function happens to have only 1 argument
which happens to be a record. Note records, unlike tuples,
can have 1 component. [Also note, a record of 0 components
should be equal to the unit tuple .. not sure if it is]

-- 
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