Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
August 04, 2012 Inconsistency with function pointers | ||||
---|---|---|---|---|
| ||||
Attachments:
| 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Russel Winder | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jacob Carlborg Attachments:
| 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Russel Winder | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Russel Winder | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to Russel Winder | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to David Nadlinger | 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 | ||||
---|---|---|---|---|
| ||||
Posted in reply to David Nadlinger Attachments:
| 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 |
Copyright © 1999-2021 by the D Language Foundation