digitalmars.D - why are types mismatch?
- Roman (19/19) Oct 01 2013 alias int function(int) function_type;
- deadalnix (5/24) Oct 01 2013 bar!foo should work as you expect.
- David Nadlinger (3/5) Oct 01 2013 Also, it will be inferred as pure, nothrow and @safe.
- Roman (5/7) Oct 01 2013 int(int i) != int function(int)
- deadalnix (6/13) Oct 01 2013 The first case is a bug to me. Can you fill it in
- Roman (4/20) Oct 01 2013 With ":" bar!((int i)=> i*2)(2) works properly, but bar!foo(2)
- Roman (2/6) Oct 01 2013 Yeah, it worked! Thanks!
- Maxim Fomin (4/26) Oct 01 2013 You are not in C, where 'function_name' (except some
- Maxim Fomin (8/39) Oct 01 2013 ???
- deadalnix (4/5) Oct 01 2013 Hoooo ! I see. Well, it should. This distinction between function
- Maxim Fomin (9/28) Oct 01 2013 foo is a function, not a function pointer
alias int function(int) function_type; void main() { bar!foo(2); bar!((int i)=> i*2)(2); } int foo(int i) { return i; } void bar(alias baz)(int i) { static if (!is(typeof(baz) == function_type)) { pragma(msg, typeof(baz), " != ", function_type); //wtf? } std.stdio.writeln(bar(i)); } Where am I wrong?
Oct 01 2013
On Tuesday, 1 October 2013 at 18:07:31 UTC, Roman wrote:alias int function(int) function_type; void main() { bar!foo(2); bar!((int i)=> i*2)(2); } int foo(int i) { return i; } void bar(alias baz)(int i) { static if (!is(typeof(baz) == function_type)) { pragma(msg, typeof(baz), " != ", function_type); //wtf? } std.stdio.writeln(bar(i)); } Where am I wrong?bar!foo should work as you expect. bar!((int i)=> i*2) is different because (int i) => i*2 is probably a template. Can you paste the output of your code so we can help you more easily ?
Oct 01 2013
On Tuesday, 1 October 2013 at 18:10:05 UTC, deadalnix wrote:bar!((int i)=> i*2) is different because (int i) => i*2 is probably a template.Also, it will be inferred as pure, nothrow and safe. David
Oct 01 2013
Can you paste the output of your code so we can help you more easily ?int(int i) != int function(int) int function(int i) pure nothrow safe != int function(int) 2 4 So, why 1st case incorrect?
Oct 01 2013
On Tuesday, 1 October 2013 at 18:38:33 UTC, Roman wrote:The first case is a bug to me. Can you fill it in http://d.puremagic.com/issues/ please ? The second is expected. What you should do is test via is(typeof(...)) : function_type). The : test for implicit conversion, and int function(int i) pure nothrow safe convert implicitly to int function(int) .Can you paste the output of your code so we can help you more easily ?int(int i) != int function(int) int function(int i) pure nothrow safe != int function(int) 2 4 So, why 1st case incorrect?
Oct 01 2013
On Tuesday, 1 October 2013 at 18:46:45 UTC, deadalnix wrote:On Tuesday, 1 October 2013 at 18:38:33 UTC, Roman wrote:With ":" bar!((int i)=> i*2)(2) works properly, but bar!foo(2) still doesn't pass expression ( evidently foo doesn't implicitly convert to function_type)The first case is a bug to me. Can you fill it in http://d.puremagic.com/issues/ please ? The second is expected. What you should do is test via is(typeof(...)) : function_type). The : test for implicit conversion, and int function(int i) pure nothrow safe convert implicitly to int function(int) .Can you paste the output of your code so we can help you more easily ?int(int i) != int function(int) int function(int i) pure nothrow safe != int function(int) 2 4 So, why 1st case incorrect?
Oct 01 2013
you probably meant baz hereyesauto x = &foo; bar!(x)(2);should work.Yeah, it worked! Thanks!
Oct 01 2013
On Tuesday, 1 October 2013 at 19:11:26 UTC, Roman wrote:On Tuesday, 1 October 2013 at 18:46:45 UTC, deadalnix wrote:You are not in C, where 'function_name' (except some circumstances) is implicitly converted to pointer to that function.On Tuesday, 1 October 2013 at 18:38:33 UTC, Roman wrote:With ":" bar!((int i)=> i*2)(2) works properly, but bar!foo(2) still doesn't pass expression ( evidently foo doesn't implicitly convert to function_type)The first case is a bug to me. Can you fill it in http://d.puremagic.com/issues/ please ? The second is expected. What you should do is test via is(typeof(...)) : function_type). The : test for implicit conversion, and int function(int i) pure nothrow safe convert implicitly to int function(int) .Can you paste the output of your code so we can help you more easily ?int(int i) != int function(int) int function(int i) pure nothrow safe != int function(int) 2 4 So, why 1st case incorrect?
Oct 01 2013
On Tuesday, 1 October 2013 at 18:10:05 UTC, deadalnix wrote:On Tuesday, 1 October 2013 at 18:07:31 UTC, Roman wrote:??? foo is not a function pointer auto x = &foo; bar!(x)(2); should work. And (int i) => i*2 is of course not a template [(i) => i*2 would be].alias int function(int) function_type; void main() { bar!foo(2); bar!((int i)=> i*2)(2); } int foo(int i) { return i; } void bar(alias baz)(int i) { static if (!is(typeof(baz) == function_type)) { pragma(msg, typeof(baz), " != ", function_type); //wtf? } std.stdio.writeln(bar(i)); } Where am I wrong?bar!foo should work as you expect. bar!((int i)=> i*2) is different because (int i) => i*2 is probably a template. Can you paste the output of your code so we can help you more easily ?
Oct 01 2013
On Tuesday, 1 October 2013 at 18:55:42 UTC, Maxim Fomin wrote:foo is not a function pointerHoooo ! I see. Well, it should. This distinction between function pointer and function do not even exists at assembly level (you always pass a function pointer to call instruction).
Oct 01 2013
On Tuesday, 1 October 2013 at 18:07:31 UTC, Roman wrote:alias int function(int) function_type;function_type is a function pointervoid main() { bar!foo(2);foo is a function, not a function pointerbar!((int i)=> i*2)(2); } int foo(int i) { return i; } void bar(alias baz)(int i) { static if (!is(typeof(baz) == function_type)) { pragma(msg, typeof(baz), " != ", function_type); //wtf? }here you are testing that baz is a function pointerstd.stdio.writeln(bar(i));you probably meant baz here} Where am I wrong?Wrong at place where you mix function type and function pointer. You are facing int(int i) != int function(int) int function(int i) pure nothrow safe != int function(int)
Oct 01 2013