Re: simple question about UFCS and templates...wasFound(i) works but not i.wasFound()

2025-03-21 Thread WhatMeWorry via Digitalmars-d-learn

On Friday, 21 March 2025 at 13:41:18 UTC, Dennis wrote:

On Thursday, 20 March 2025 at 16:18:32 UTC, WhatMeWorry wrote:

Yup. That was the problem. Thank you. You guys are a sharp.


From dmd version 2.111, there will be a better error message in 
this case.


https://github.com/dlang/dmd/pull/21046


THANKS. I LOVE D!


Re: simple question about UFCS and templates...wasFound(i) works but not i.wasFound()

2025-03-21 Thread Dennis via Digitalmars-d-learn

On Thursday, 20 March 2025 at 16:18:32 UTC, WhatMeWorry wrote:

Yup. That was the problem. Thank you. You guys are a sharp.


From dmd version 2.111, there will be a better error message in 
this case.


https://github.com/dlang/dmd/pull/21046



Re: simple question about UFCS and templates...wasFound(i) works but not i.wasFound()

2025-03-20 Thread WhatMeWorry via Digitalmars-d-learn

Yup. That was the problem. Thank you. You guys are a sharp.


Re: simple question about UFCS and templates...wasFound(i) works but not i.wasFound()

2025-03-19 Thread Paul Backus via Digitalmars-d-learn
On Thursday, 20 March 2025 at 02:01:25 UTC, Jonathan M Davis 
wrote:
On Wednesday, March 19, 2025 5:48:37 PM MDT H. S. Teoh via 
Digitalmars-d-learn wrote:
I thought it was always a miss. :-D  At least, it's never 
worked for me every time I tried it.  I always have to move 
the UFCS function to module scope, then it works.


AFAIK, it's always a miss. There's a bug report somewhere where 
Kenji explained exactly why it works the way that it does, but 
I don't recall what he said. I also don't know if it was closed 
as "won't fix" or remember much that would make it easy to 
find, unfortunately. :|


But there is a technical reason for the limitation, even if I 
don't remember what it is.


It's to prevent UFCS functions from being shadowed by local 
variables. From the spec:


Rationale: Local function symbols are not considered by UFCS to 
avoid unexpected name conflicts.


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


Re: simple question about UFCS and templates...wasFound(i) works but not i.wasFound()

2025-03-19 Thread Jonathan M Davis via Digitalmars-d-learn
On Wednesday, March 19, 2025 5:48:37 PM MDT H. S. Teoh via Digitalmars-d-learn 
wrote:
> On Wed, Mar 19, 2025 at 11:21:15PM +, monkyyy via Digitalmars-d-learn 
> wrote:
> [...]
> > ufcs on local functions is hit or miss;
> [...]
>
> I thought it was always a miss. :-D  At least, it's never worked for me
> every time I tried it.  I always have to move the UFCS function to
> module scope, then it works.

AFAIK, it's always a miss. There's a bug report somewhere where Kenji
explained exactly why it works the way that it does, but I don't recall what
he said. I also don't know if it was closed as "won't fix" or remember much
that would make it easy to find, unfortunately. :|

But there is a technical reason for the limitation, even if I don't remember
what it is.

- Jonathan M Davis





Re: simple question about UFCS and templates...wasFound(i) works but not i.wasFound()

2025-03-19 Thread H. S. Teoh via Digitalmars-d-learn
On Wed, Mar 19, 2025 at 10:26:54PM +, WhatMeWorry via Digitalmars-d-learn 
wrote:
[...]
> The above compiles and executes successfully. But the following fails
> with: app.d(179,13): Error: no property `wasFound` for `i` of type
> `long`
> 
> I thought the templated function would take care of any type.
> ```
> bool wasFound(I)(I result)
> {
> return(result != -1);
> }
> 
> bool existPoint(Point b, int cost)
> {
> auto i = closed.countUntil(b);  // Note: closed
> 
> if(i.wasFound())   // -1 is returned if no point b is found in the 
> range
> ```

Where is wasFound declared?  If you want UFCS syntax to work, wasFound
must be declared in global (module) scope. Otherwise, it will not be
considered for UFCS when resolving identifiers.


T

-- 
The cat owns the house; that's why the word "homeowner" has "meow" in it.


Re: simple question about UFCS and templates...wasFound(i) works but not i.wasFound()

2025-03-19 Thread H. S. Teoh via Digitalmars-d-learn
On Wed, Mar 19, 2025 at 11:21:15PM +, monkyyy via Digitalmars-d-learn wrote:
[...]
> ufcs on local functions is hit or miss;
[...]

I thought it was always a miss. :-D  At least, it's never worked for me
every time I tried it.  I always have to move the UFCS function to
module scope, then it works.


T

-- 
What's an anagram of "BANACH-TARSKI"?  BANACH-TARSKI BANACH-TARSKI.


Re: simple question about UFCS and templates...wasFound(i) works but not i.wasFound()

2025-03-19 Thread monkyyy via Digitalmars-d-learn

On Wednesday, 19 March 2025 at 22:26:54 UTC, WhatMeWorry wrote:

```
   bool wasFound(I)(I result)
{
return(result != -1);
}

bool existPoint(Point b, int cost)
{
auto i = closed.countUntil(b);

if(wasFound(i))   // -1 is returned if no point b is 
found in the range

```

The above compiles and executes successfully. But the following 
fails with:
app.d(179,13): Error: no property `wasFound` for `i` of type 
`long`


I thought the templated function would take care of any type.
```
bool wasFound(I)(I result)
{
return(result != -1);
}

bool existPoint(Point b, int cost)
{
auto i = closed.countUntil(b);  // Note: closed

if(i.wasFound())   // -1 is returned if no point b is 
found in the range

```


ufcs on local functions is hit or miss; theres a old limitation 
that d1 wanted or something; ussally templates do fix it but 
without full context its hard for me to tell the exact reason.


simple question about UFCS and templates...wasFound(i) works but not i.wasFound()

2025-03-19 Thread WhatMeWorry via Digitalmars-d-learn

```
   bool wasFound(I)(I result)
{
return(result != -1);
}

bool existPoint(Point b, int cost)
{
auto i = closed.countUntil(b);

if(wasFound(i))   // -1 is returned if no point b is 
found in the range

```

The above compiles and executes successfully. But the following 
fails with:
app.d(179,13): Error: no property `wasFound` for `i` of type 
`long`


I thought the templated function would take care of any type.
```
bool wasFound(I)(I result)
{
return(result != -1);
}

bool existPoint(Point b, int cost)
{
auto i = closed.countUntil(b);  // Note: closed

if(i.wasFound())   // -1 is returned if no point b is 
found in the range

```