August 04, 2012
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
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
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
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
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
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
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
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