simple ABI change to enable implicit conversion of functions to delegates?

ag0aep6g via Digitalmars-d digitalmars-d at puremagic.com
Mon May 15 10:06:34 PDT 2017


On 05/15/2017 05:44 PM, Jonathan Marler wrote:
> Not sure if members in this conversation were aware of my DIP to address
> this issue:
>
> https://github.com/dlang/DIPs/pull/61
>
> The DIP uses a different approach to solve this same problem. It adds
> new semantics to specify whether a function should use the same ABI as a
> delegate, called a "delegateable function".
>
> The solution you have proposed would remove the need for my DIP by
> reconciling the difference between the function ABI and delegate ABI.

I was aware of your DIP. I think they're related, but don't really 
overlap that much.

You want to add a special kind of parameter that is taken as the context 
pointer when making a delegate of the function. You also add syntax to 
combine such a function with a matching `this` into a delegate.

I'd like the context pointer to be passed differently, so that a normal 
function doesn't mistake it for one of its parameters.

I don't think my thing would make your thing obsolete.

> You have two ways to go about this, either modify the delegate ABI to
> match the function ABI, or the reverse.  The specific change could be
> stated as:
>
> Modify the function/delegate ABI so that the first parameter of every
> function is passed in the same way as the context pointer of a delegate.

If I'm reading it right, with that rule this would be valid:

----
struct Foo { int x; }
void baz(Foo* foo, int y) { import std.stdio; writeln(foo.x, " ", y); }
void main()
{
     void delegate(int y) dg;
     dg.funcptr = &baz; /* parameter `foo` is taken as context pointer */
     dg.ptr = new Foo(1);
     dg(2); /* would print "1 2" */
}
----

That's not what I'm after. With my (crude) idea, that code would be just 
as invalid as it is now. A function's parameters would have to match the 
(visible) parameters of the delegate type. Any context pointer would be 
passed in a spot where the function doesn't look.

The point is to allow using functions as delegates that don't use the 
context pointer.


More information about the Digitalmars-d mailing list