View mode: basic / threaded / horizontal-split · Log in · Help
August 04, 2012
Inconsistency with function pointers
I am sure I am just missing something simple, but I need the nudge…

I can do:

       import core.thread ;
       import std.stdio ;
       
       int main(immutable string[] args) {
         auto f() { return delegate () { writeln("Hello World."); }; }
         auto t = new Thread(f);
         t.start();
         t.join();
         return 0;
       }

it is Thread(f) rather than Thread(&f) because f is a function returning
a void delegate() rather than being a void(). However:

       import core.thread ;
       import std.stdio ;
       
       int main(immutable string[] args) {
         auto t = new Thread( delegate () { return delegate () { writeln("Hello World."); }; } ) ;
         t.start();
         t.join();
         return 0;
       }

trial.d(7): Error: constructor core.thread.Thread.this (void function()
fn, ulong sz = cast(ulong)0) is not callable using argument types (void
delegate() delegate() pure nothrow @safe)
Failed: 'dmd' '-v' '-o-' 'trial.d' '-I.'

So I cannot use an anonymous delegate where I can use a named delegate?
-- 
Russel.
=============================================================================
Dr Russel Winder      t: +44 20 7585 2200   voip: sip:russel.winder@ekiga.net
41 Buckmaster Road    m: +44 7770 465 077   xmpp: russel@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder
August 04, 2012
Re: Inconsistency with function pointers
On 2012-08-04 17:06, Russel Winder wrote:
> I am sure I am just missing something simple, but I need the nudge…
>
> I can do:
>
>          import core.thread ;
>          import std.stdio ;
>
>          int main(immutable string[] args) {
>            auto f() { return delegate () { writeln("Hello World."); }; }
>            auto t = new Thread(f);
>            t.start();
>            t.join();
>            return 0;
>          }
>
> it is Thread(f) rather than Thread(&f) because f is a function returning
> a void delegate() rather than being a void(). However:
>
>          import core.thread ;
>          import std.stdio ;
>
>          int main(immutable string[] args) {
>            auto t = new Thread( delegate () { return delegate () { writeln("Hello World."); }; } ) ;
>            t.start();
>            t.join();
>            return 0;
>          }
>
> trial.d(7): Error: constructor core.thread.Thread.this (void function()
> fn, ulong sz = cast(ulong)0) is not callable using argument types (void
> delegate() delegate() pure nothrow @safe)
> Failed: 'dmd' '-v' '-o-' 'trial.d' '-I.'
>
> So I cannot use an anonymous delegate where I can use a named delegate?

If you take a look at the declaration of the constructor for "Thread" 
you can see that it expects a function pointer. I'm not sure what's 
happening in the first example. I don't think any of the above examples 
should work.

-- 
/Jacob Carlborg
August 04, 2012
Re: Inconsistency with function pointers
Jacob,

On Sat, 2012-08-04 at 18:02 +0200, Jacob Carlborg wrote:
> On 2012-08-04 17:06, Russel Winder wrote:
> > I am sure I am just missing something simple, but I need the nudge…
> >
> > I can do:
> >
> >          import core.thread ;
> >          import std.stdio ;
> >
> >          int main(immutable string[] args) {
> >            auto f() { return delegate () { writeln("Hello World."); }; }

Changing this to function makes no difference to the fact that this
works.

> >            auto t = new Thread(f);

Put &f here and the compiler says:

threadFunctionPointerTrial.d(6): Error: constructor core.thread.Thread.this (void function() fn, ulong sz = cast(ulong)0) is not callable using argument types (void function() delegate())
threadFunctionPointerTrial.d(6): Error: cannot implicitly convert expression (&f) of type void function() delegate() to void delegate()
Failed: 'dmd' '-v' '-o-' 'threadFunctionPointerTrial.d' '-I.'

> >            t.start();
> >            t.join();
> >            return 0;
> >          }
> >
> > it is Thread(f) rather than Thread(&f) because f is a function returning
> > a void delegate() rather than being a void(). However:
> >
> >          import core.thread ;
> >          import std.stdio ;
> >
> >          int main(immutable string[] args) {
> >            auto t = new Thread( delegate () { return delegate () { writeln("Hello World."); }; } ) ;
> >            t.start();
> >            t.join();
> >            return 0;
> >          }
> >
> > trial.d(7): Error: constructor core.thread.Thread.this (void function()
> > fn, ulong sz = cast(ulong)0) is not callable using argument types (void
> > delegate() delegate() pure nothrow @safe)
> > Failed: 'dmd' '-v' '-o-' 'trial.d' '-I.'
> >
> > So I cannot use an anonymous delegate where I can use a named delegate?
> 
> If you take a look at the declaration of the constructor for "Thread" 
> you can see that it expects a function pointer. I'm not sure what's 
> happening in the first example. I don't think any of the above examples 
> should work.

Isn't there an overload for function and one for delegate?

threadFunctionPointerUnnamed.d(5): Error: constructor core.thread.Thread.this called with argument types:
	((void function()))
matches both:
	core.thread.Thread.this(void function() fn, ulong sz = cast(ulong)0)
and:
	core.thread.Thread.this(void delegate() dg, ulong sz = cast(ulong)0)
Failed: 'dmd' '-v' '-o-' 'threadFunctionPointerUnnamed.d' '-I.'

-- 
Russel.
=============================================================================
Dr Russel Winder      t: +44 20 7585 2200   voip: sip:russel.winder@ekiga.net
41 Buckmaster Road    m: +44 7770 465 077   xmpp: russel@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder
August 04, 2012
Re: Inconsistency with function pointers
On Saturday, 4 August 2012 at 15:23:39 UTC, Russel Winder wrote:
[...]
> I can do:
[...]
>           auto f() { return delegate () { writeln("Hello 
> World."); }; }
>           auto t = new Thread(f);
[...]
> However:
[...]
>           auto t = new Thread( delegate () { return delegate () 
> { writeln("Hello World."); }; } ) ;
[doesn't work]

You need parentheses to call the anonymous delegate:
auto t = new Thread( delegate () { return delegate () {
writeln("Hello World."); }; }()) ;

You don't need them with f, because there you have to write &f to
refer to the delegate itself. (And because you don't use
-property.)
August 04, 2012
Re: Inconsistency with function pointers
On 2012-08-04 18:41, Russel Winder wrote:

> Isn't there an overload for function and one for delegate?
>
> threadFunctionPointerUnnamed.d(5): Error: constructor core.thread.Thread.this called with argument types:
> 	((void function()))
> matches both:
> 	core.thread.Thread.this(void function() fn, ulong sz = cast(ulong)0)
> and:
> 	core.thread.Thread.this(void delegate() dg, ulong sz = cast(ulong)0)
> Failed: 'dmd' '-v' '-o-' 'threadFunctionPointerUnnamed.d' '-I.'

Hmm, right. I didn't scroll down far enough. Then I don't know.

-- 
/Jacob Carlborg
August 04, 2012
Re: Inconsistency with function pointers
On Saturday, 4 August 2012 at 15:23:39 UTC, Russel Winder wrote:
> trial.d(7): Error: constructor core.thread.Thread.this (void 
> function()
> fn, ulong sz = cast(ulong)0) is not callable using argument 
> types (void
> delegate() delegate() pure nothrow @safe)
> Failed: 'dmd' '-v' '-o-' 'trial.d' '-I.'
>
> So I cannot use an anonymous delegate where I can use a named 
> delegate?

You are trying to pass a delegate which returns a delegate – 
this isn't going to work. ;)

In your first example is that f is implicitly called due to the 
non-strict property syntax.

David
August 04, 2012
Re: Inconsistency with function pointers
On Saturday, 4 August 2012 at 19:03:30 UTC, David Nadlinger wrote:
> In your first example is that […]

Darn, make this »In your first example, …«.
August 05, 2012
Re: Inconsistency with function pointers
On Sat, 2012-08-04 at 21:03 +0200, David Nadlinger wrote:
[…]
> You are trying to pass a delegate which returns a delegate – 
> this isn't going to work. ;)

But that is my whole point, it does a lot of the time, and it depends on
whether you are working with named functions and delegates or with
anonymous functions and delegates.

> In your first example is that f is implicitly called due to the 
> non-strict property syntax.

OK, so this is looking like the nudge that anonymous was also talking
about, but from a different viewpoint. It seems there is implicit
behaviour going on here that is creating right royal confusion on the
part of at least one programmer, me.

The parameter I think I am passing to thread construction is sometimes,
but not mostly, not the parameter the Thread constructors are receiving.
This looks like it is going to violate the Principle of Least
Surprise :-(

-- 
Russel.
=============================================================================
Dr Russel Winder      t: +44 20 7585 2200   voip: sip:russel.winder@ekiga.net
41 Buckmaster Road    m: +44 7770 465 077   xmpp: russel@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder
Top | Discussion index | About this forum | D home