UFCS for struct opCall?
bearophile
bearophileHUGS at lycos.com
Mon Apr 8 16:48:12 PDT 2013
On request by Maxim Fomin I ask an opinion here. This is a very
small enhancement request, that for me is borderline bug report
(so originally I didn't plan in showing it in the main D
newsgroup):
http://d.puremagic.com/issues/show_bug.cgi?id=9857
Maybe this should be valid:
struct Foo {
int opCall(bool b) {
return 0;
}
}
void main() {
Foo foo;
auto b1 = foo(true); // OK
auto b2 = true.foo; // Error
}
dmd 2.063alpha gives:
temp.d(9): Error: no property 'foo' for type 'bool'
Explanation:
1) I am using UFCS often in D, for functions, higher order
functions, etc. A struct with an opCall method is usable like a
function with state. So for uniformity with the other functions
I'd like to use it with UFCS. When you have a long UFCS chain you
don't want to break it, if it's possible.
2) Both struct constructors, struct implicit constructors and
struct static opCall support UFCS, so I don't see a good reason
for just the normal struct opCall to not support it:
struct Foo {
static int opCall(int x) {
return x * 2;
}
}
struct Bar {
int x;
this(int y) {
x = y * 2;
}
}
struct Spam {
int x;
}
void main() {
assert(10.Foo == 20);
assert(10.Bar.x == 20);
assert(10.Spam.x == 10);
}
Jonathan Davis doesn't like this. For more information I suggest
to take a look at the thread in Bugzilla.
- - - - - - - - - - -
Regarding UFCS, currently this doesn't work, I don't know if this
should be considered a bug or not (I think the answer is
positive):
struct Node {}
void foo(Node* p) {}
void main() {
auto p = new Node();
foo(p); // OK
p.foo; // Error: no property 'foo' for type 'Node'
}
Bye,
bearophile
More information about the Digitalmars-d
mailing list