[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-17 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265



--- Comment #9 from SHOO zan77...@nifty.com 2012-01-17 06:37:31 PST ---
By the way, the reason why I set this Issue with regression is that I cause a
difficult problem with the following cases:

--
import std.stdio, std.functional;

// Library code
struct Control {
alias void delegate(Control o) Handler;
Handler[] _handlers;

void addHandler(H)(H hnd) {
_handlers ~= cast(Handler)hnd;
}

void addHandler2(H)(H hnd) if (is(H == delegate)) {
_handlers ~= cast(Handler)hnd;
}

// Workaround. It is settled if can handle either by toDelegate.
void addHandler3(H)(H hnd) {
_handlers ~= cast(Handler)toDelegate(hnd);
}

void call() {
foreach (h; _handlers) {
h(this);
}
}
}

// User code
void main() {
int i;
auto c = new Control;
// OK. This literal is inferred delegate.
c.addHandler( (Object o){ writeln(i); } );

// Error. This literal is inferred function pointer.
//c.addHandler( (Object o){ writeln(test); } );

// Error. This literal is inferred function pointer, too.
// The constraint-if does not influence the type inference.
//c.addHandler2( (Object o){ writeln(test2); } );

// Workaround.
c.addHandler3( (Object o){ writeln(test3); } );

c.call();
}
--

When a library code has a definition such as Control, many breaking changes
befall user codes.
Actually, this way is used by DFL.

One of simple workaround is to use toDelegate with library codes.

I think that another solution is to let implicit conversion perform a role as
toDelegate.

I remember it has entered ML agenda several times. But I've forgotten the
conclusion.
Is there a person knowing the details?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-17 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265



--- Comment #10 from timon.g...@gmx.ch 2012-01-17 10:11:05 PST ---
(In reply to comment #9)
 One of simple workaround is to use toDelegate with library codes.
 
 I think that another solution is to let implicit conversion perform a role as
 toDelegate.
 
 I remember it has entered ML agenda several times. But I've forgotten the
 conclusion.
 Is there a person knowing the details?

I think no conclusion has been reached yet. Andrei (and me too) wants implicit
conversions from function pointer to delegate to work, but Walter disagrees
with it.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-16 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265



--- Comment #2 from SHOO zan77...@nifty.com 2012-01-16 03:48:12 PST ---
(In reply to comment #1)
 This is a case of outdated documentation.
 From TDPL, p150:
 If both function and delegate are absent from the literal, the compiler
 automatically detects which one is necessary.

It is an example unlike the specifications(TDPL, p150).

The case is the following situation:

---
import std.stdio, std.traits;

void main()
{
void function() fn = { writeln(function); };
static assert(isFunctionPointer!(typeof(fn)));

void delegate() dg = { writeln(delegate); };
static assert(isDelegate!(typeof(dg)));
}
---

As noted above, the specifications are applied only when there is a necessary
type.
When there is not a required type, in the case like this time, it should infer
the type of the default.

This resembles the following examples:
---
import std.traits;

void main()
{
byte a = 1; // typeof(a) is byte
auto b = 1; // typeof(b) is int

// int cannot implicitly cast to byte.
static assert (isImplicitlyConvertible!(typeof(b), typeof(a))); // false.
}
---

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-16 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265


timon.g...@gmx.ch changed:

   What|Removed |Added

  Component|DMD |websites


--- Comment #3 from timon.g...@gmx.ch 2012-01-16 08:44:22 PST ---
Everything behaves as specified in TDPL. This is not a compiler bug.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-16 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265


Andrei Alexandrescu and...@metalanguage.com changed:

   What|Removed |Added

 CC||and...@metalanguage.com


--- Comment #4 from Andrei Alexandrescu and...@metalanguage.com 2012-01-16 
09:25:15 PST ---
(In reply to comment #3)
 Everything behaves as specified in TDPL. This is not a compiler bug.

Yah, I just tested this:

import std.stdio, std.traits;
void main()
{
auto fn = { writeln(function); };
static assert(isFunctionPointer!(typeof(fn)));
int x;
auto dg = { writeln(delegate because it prints , x); };
static assert(isDelegate!(typeof(dg)));
}

So the literal is properly classified as a function or delegate depending on it
needing a frame pointer or not.

There's one remaining question I have. I rewrote the example like this:


import std.stdio, std.traits;

void main()
{
auto fn = { writeln(function); };
static assert(is(typeof(fn) == function));

int x;
auto dg = { writeln(delegate because it prints , x); };
static assert(is(typeof(dg) == delegate));
}

The second static assert works, but the first doesn't. Why?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-16 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265



--- Comment #5 from SHOO zan77...@nifty.com 2012-01-16 10:07:04 PST ---
(In reply to comment #4)
 (In reply to comment #3)
  Everything behaves as specified in TDPL. This is not a compiler bug.
 
 Yah, I just tested this:
 
 import std.stdio, std.traits;
 void main()
 {
 auto fn = { writeln(function); };
 static assert(isFunctionPointer!(typeof(fn)));
 int x;
 auto dg = { writeln(delegate because it prints , x); };
 static assert(isDelegate!(typeof(dg)));
 }
 
 So the literal is properly classified as a function or delegate depending on 
 it
 needing a frame pointer or not.
 

Hmm...
Because it included a clear breaking change, I thought that a sample code was
wrong.

 There's one remaining question I have. I rewrote the example like this:
 
 
 import std.stdio, std.traits;
 
 void main()
 {
 auto fn = { writeln(function); };
 static assert(is(typeof(fn) == function));
 
 int x;
 auto dg = { writeln(delegate because it prints , x); };
 static assert(is(typeof(dg) == delegate));
 }
 
 The second static assert works, but the first doesn't. Why?

fn of the first case is a function pointer and is not a function. The code
outputs a compilation error definitely.

-
import std.stdio, std.traits;

void main()
{
static assert(is(typeof(main) == function)); // true, typeof(main) is
function
static assert(is(typeof(main) == function)); // false, typeof(main) is
function pointer
}
-

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-16 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265



--- Comment #6 from Andrei Alexandrescu and...@metalanguage.com 2012-01-16 
10:15:03 PST ---
(In reply to comment #5)
 -
 import std.stdio, std.traits;
 
 void main()
 {
 static assert(is(typeof(main) == function)); // true, typeof(main) is
 function
 static assert(is(typeof(main) == function)); // false, typeof(main) is
 function pointer
 }
 -

I think fn in

auto fn = { ... };

should be the same thing - a name for a function. I guess that's not easy to
implement. Kenji, Walter?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-16 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265



--- Comment #7 from Kenji Hara k.hara...@gmail.com 2012-01-16 16:11:52 PST ---
 I think fn in
 
 auto fn = { ... };
 
 should be the same thing - a name for a function. I guess that's not easy to
 implement. Kenji, Walter?

Rewriting it to true function declaration is easy, but
fn is looks like a variable so peaple will try to
rebind it with assignment:

  fn = { writeln(another function literal); };

and will get an error. It is inconsistent.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-16 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265


Andrei Alexandrescu and...@metalanguage.com changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution||FIXED


--- Comment #8 from Andrei Alexandrescu and...@metalanguage.com 2012-01-16 
16:36:05 PST ---
OK, thanks.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 7265] Function Literals where a keyword was omitted should be delegate even if inference.

2012-01-15 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=7265


timon.g...@gmx.ch changed:

   What|Removed |Added

 CC||timon.g...@gmx.ch
  Component|DMD |websites
   Severity|regression  |normal


--- Comment #1 from timon.g...@gmx.ch 2012-01-15 11:56:18 PST ---
This is a case of outdated documentation.
From TDPL, p150:
If both function and delegate are absent from the literal, the compiler
automatically detects which one is necessary.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---