Thread overview
No UFCS with nested functions?
Nov 04, 2019
Tobias Pankrath
Nov 04, 2019
H. S. Teoh
Nov 05, 2019
ixid
Nov 05, 2019
Jonathan M Davis
Nov 05, 2019
Nicholas Wilson
Nov 05, 2019
Paul Backus
November 04, 2019
Why does the following not work? It works, if I move the 'prop' out of 'foo'.

---
struct S {
	ubyte[12] bar;
}

bool foo (ref S s)
{
   static bool prop(const(ubyte)[] f) {
      return f.length > 1;
   }
	return s.bar[].prop;
}
---

Thanks!


November 04, 2019
On Mon, Nov 04, 2019 at 07:51:26PM +0000, Tobias Pankrath via Digitalmars-d-learn wrote:
> Why does the following not work? It works, if I move the 'prop' out of 'foo'.

UFCS is only supported for module-level functions, as far as I know.


> ---
> struct S {
> 	ubyte[12] bar;
> }
> 
> bool foo (ref S s)
> {
>    static bool prop(const(ubyte)[] f) {
>       return f.length > 1;
>    }
> 	return s.bar[].prop;
> }
> ---
[...]


T

-- 
I am not young enough to know everything. -- Oscar Wilde
November 05, 2019
On Monday, 4 November 2019 at 19:51:26 UTC, Tobias Pankrath wrote:
> Why does the following not work? It works, if I move the 'prop' out of 'foo'.
>
> ---
> struct S {
> 	ubyte[12] bar;
> }
>
> bool foo (ref S s)
> {
>    static bool prop(const(ubyte)[] f) {
>       return f.length > 1;
>    }
> 	return s.bar[].prop;
> }
> ---
>
> Thanks!

https://blog.thecybershadow.net/2015/04/28/the-amazing-template-that-does-nothing/

struct S {
	ubyte[12] bar;
}

alias I(alias f) = f;

bool foo (ref S s)
{
   static bool prop(const(ubyte)[] f) {
      return f.length > 1;
   }
	return s.bar[].I!prop;
}
November 05, 2019
On Tuesday, 5 November 2019 at 00:34:33 UTC, Nicholas Wilson wrote:
> https://blog.thecybershadow.net/2015/04/28/the-amazing-template-that-does-nothing/
>
> struct S {
> 	ubyte[12] bar;
> }
>
> alias I(alias f) = f;
>
> bool foo (ref S s)
> {
>    static bool prop(const(ubyte)[] f) {
>       return f.length > 1;
>    }
> 	return s.bar[].I!prop;
> }

It's in Phobos:

import std.meta: Alias;

return s.bar[].Alias!prop
November 05, 2019
On Monday, 4 November 2019 at 20:46:41 UTC, H. S. Teoh wrote:
> On Mon, Nov 04, 2019 at 07:51:26PM +0000, Tobias Pankrath via Digitalmars-d-learn wrote:
>> Why does the following not work? It works, if I move the 'prop' out of 'foo'.
>
> UFCS is only supported for module-level functions, as far as I know.
>
>
>> ---
>> struct S {
>> 	ubyte[12] bar;
>> }
>> 
>> bool foo (ref S s)
>> {
>>    static bool prop(const(ubyte)[] f) {
>>       return f.length > 1;
>>    }
>> 	return s.bar[].prop;
>> }
>> ---
> [...]
>
>
> T

Is this a necessary limitation? It feels inconsistent and clunky.
November 05, 2019
On Tuesday, November 5, 2019 9:16:27 AM MST ixid via Digitalmars-d-learn wrote:
> On Monday, 4 November 2019 at 20:46:41 UTC, H. S. Teoh wrote:
> > On Mon, Nov 04, 2019 at 07:51:26PM +0000, Tobias Pankrath via
> >
> > Digitalmars-d-learn wrote:
> >> Why does the following not work? It works, if I move the 'prop' out of 'foo'.
> >
> > UFCS is only supported for module-level functions, as far as I know.
> >
> >> ---
> >> struct S {
> >>
> >>    ubyte[12] bar;
> >>
> >> }
> >>
> >> bool foo (ref S s)
> >> {
> >>
> >>    static bool prop(const(ubyte)[] f) {
> >>
> >>       return f.length > 1;
> >>
> >>    }
> >>
> >>    return s.bar[].prop;
> >>
> >> }
> >> ---
> >
> > [...]
> >
> >
> > T
>
> Is this a necessary limitation? It feels inconsistent and clunky.

It's explained at the end of this section of the documentation:

https://dlang.org/spec/function.html#pseudo-member

- Jonathan M Davis