On 16/08/2012, at 6:54 AM, dobesv wrote:

> Currently to map C++ methods to felix you cannot rely on the default template.
> 
> The default template for C function bindings is something like "$0($a)" 
> (where $0 is the name of the function).
> 
> For methods it should be "$1->$0($a)" or "$1.$0($a)".
> 
> Perhaps an adjective "method" on the function definition would cause it to 
> use the latter form when no explicit template is provided.


There's a somewhat related set of issues here.

(1) At present you can make function like:

        fun f: int -> int -> int -> int = "f($1,$2,$3)";

but it won't work as expected, f 1 will fail by generating

        f(1,$2, $3) 

or else give an error (not sure). And f 1 2 3 will fail
the same way, trying to apply 

        f(1,$2,$3) 2 3

I could hack this so it works. Making f 1 2 3 work
isn't so hard. Making f 1 work is a bit harder.
however Felix already automagically wraps 
macros like 

        f: int->int = "$1";

 into functions by

        fun f_closure (x:int) => f x;

if you happen to try to use f as a closure, you actually
get f_closure.

note that

        fun f: int * int -> int;

is a cheat. The f macro will NOT accept a tuple argument,
it accepts two arguments, but Felix maps a tuple into these
two arguments. If you actually wanted a single tuple argument
you have to write

        fun f: int * int -> int = "f($t)";

(2) There is another problem for C++ bindings:

        fun f: int -> int;

binds to "whatever f is in scope". If you want to bind to 

        ::myspace::f

you have to write

        fun f:int->int = "::myspace::f($a)";

This is not much of a problem for function but for types,
there's no way to do it:

        cstruct X { x ; int; };

binds Felix X to whatever X is in scope. It isn't possible
to bind X to ::myspace::X other than by 

        type X = "::myspace::X";

and if you do that you lose the members.

(3) For class methods something like:

        cclass X {
                fun f: int -> int;
        }

might make sense, this produces:

        fun f: X * int -> int = "$1.f($2)";
        fun f:  &X * int -> int = "$1->f($2)";

however that's a bit sick, better would be:

        fun f: X -> int -> int

which would also allow an object closure, as well has
handling both variables of type X and pointers &X.
The only problem is that

        f object

would be ambiguous if there's more than one method named f.
If you do this in C++ or any other OO language .. you deserve what you get!

note you can already write:

        struct X {
                x : int;
                fun add (y:int) => self.x+y;
        }

in Felix, and

        anX . add

is perfectly legitimate and forms an object closure. The actual signature
of add is:

        fun add: X -> int -> int;

and the definition is:

        fun f(self:X) (y:int) => self.x + y;

The transformation is done in the parser so there is no semantic impact.

--
john skaller
skal...@users.sourceforge.net
http://felix-lang.org




------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Felix-language mailing list
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to