www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - UFCS confusion

reply Michael <michael toohuman.io> writes:
Hello,

I am nesting some function calls, and I'm pretty used to making 
use of D's Uniform Function Call Syntax, but I'm getting an error 
if I try to convert this line:

 createSet(createVector(langSize, index)).length;
which works, into this line:
 createVector(langSize, index).createSet.length;
receiving the error "Error: no property createSet for type int[]", when the signature for createSet is:
 static auto createSet(in int[] vector) pure
What am I missing here? I'm sure it's stupidly obvious but it expects one argument, so I'm just calling it without parentheses.
Jul 13 2018
parent reply Radu <void null.pt> writes:
On Friday, 13 July 2018 at 10:21:54 UTC, Michael wrote:
 Hello,

 I am nesting some function calls, and I'm pretty used to making 
 use of D's Uniform Function Call Syntax, but I'm getting an 
 error if I try to convert this line:

 createSet(createVector(langSize, index)).length;
which works, into this line:
 createVector(langSize, index).createSet.length;
receiving the error "Error: no property createSet for type int[]", when the signature for createSet is:
 static auto createSet(in int[] vector) pure
What am I missing here? I'm sure it's stupidly obvious but it expects one argument, so I'm just calling it without parentheses.
Do you try to call member functions? UFCS only works with free functions, meaning declared at module level. https://dlang.org/spec/function.html#pseudo-member
Jul 13 2018
parent reply Michael <michael toohuman.io> writes:
On Friday, 13 July 2018 at 10:52:54 UTC, Radu wrote:
 On Friday, 13 July 2018 at 10:21:54 UTC, Michael wrote:
 Hello,

 I am nesting some function calls, and I'm pretty used to 
 making use of D's Uniform Function Call Syntax, but I'm 
 getting an error if I try to convert this line:

 createSet(createVector(langSize, index)).length;
which works, into this line:
 createVector(langSize, index).createSet.length;
receiving the error "Error: no property createSet for type int[]", when the signature for createSet is:
 static auto createSet(in int[] vector) pure
What am I missing here? I'm sure it's stupidly obvious but it expects one argument, so I'm just calling it without parentheses.
Do you try to call member functions? UFCS only works with free functions, meaning declared at module level. https://dlang.org/spec/function.html#pseudo-member
I'm not intentionally trying to call member functions, no. The functions are all static functions of a class, but the chaining of them using UFCS doesn't seem to work.
Jul 13 2018
parent reply Radu <void null.pt> writes:
On Friday, 13 July 2018 at 11:12:47 UTC, Michael wrote:
 On Friday, 13 July 2018 at 10:52:54 UTC, Radu wrote:
 On Friday, 13 July 2018 at 10:21:54 UTC, Michael wrote:
 [...]
Do you try to call member functions? UFCS only works with free functions, meaning declared at module level. https://dlang.org/spec/function.html#pseudo-member
I'm not intentionally trying to call member functions, no. The functions are all static functions of a class, but the chaining of them using UFCS doesn't seem to work.
OK, static functions of a class are static *member* functions, they are not free functions.
Jul 13 2018
parent reply Michael <michael toohuman.io> writes:
On Friday, 13 July 2018 at 11:17:32 UTC, Radu wrote:
 On Friday, 13 July 2018 at 11:12:47 UTC, Michael wrote:
 On Friday, 13 July 2018 at 10:52:54 UTC, Radu wrote:
 On Friday, 13 July 2018 at 10:21:54 UTC, Michael wrote:
 [...]
Do you try to call member functions? UFCS only works with free functions, meaning declared at module level. https://dlang.org/spec/function.html#pseudo-member
I'm not intentionally trying to call member functions, no. The functions are all static functions of a class, but the chaining of them using UFCS doesn't seem to work.
OK, static functions of a class are static *member* functions, they are not free functions.
Oh, really? Well that will explain it then. I was sure I had used this syntax before but perhaps not. Thanks for your help!
Jul 13 2018
parent vit <vit vit.vit> writes:
On Friday, 13 July 2018 at 11:37:09 UTC, Michael wrote:
 On Friday, 13 July 2018 at 11:17:32 UTC, Radu wrote:
 On Friday, 13 July 2018 at 11:12:47 UTC, Michael wrote:
 On Friday, 13 July 2018 at 10:52:54 UTC, Radu wrote:
 On Friday, 13 July 2018 at 10:21:54 UTC, Michael wrote:
 [...]
Do you try to call member functions? UFCS only works with free functions, meaning declared at module level. https://dlang.org/spec/function.html#pseudo-member
I'm not intentionally trying to call member functions, no. The functions are all static functions of a class, but the chaining of them using UFCS doesn't seem to work.
OK, static functions of a class are static *member* functions, they are not free functions.
Oh, really? Well that will explain it then. I was sure I had used this syntax before but perhaps not. Thanks for your help!
try this: import std.functional : pipe; createVector(langSize, index).pipe!createSet.length;
Jul 16 2018