Comment #0 by bearophile_hugs — 2011-07-08T18:03:32Z
Just like "final" applied to a class makes all its methods non-virtual:
final class Foo {
int x;
this(int xx) { x = xx; }
void bar() {}
static void spam() {}
}
void main() {}
I'd like the attribute "pure" applied to a struct/class (in DMD 2.054beta this doesn't compile):
pure struct Foo {
int x;
this(int xx) { x = xx; }
void bar() {}
static void spam() {}
}
void main() pure {
Foo f = Foo(1);
f.bar();
Foo.spam();
}
to be equivalent to adding "pure" to all its methods:
struct Foo {
int x;
this(int xx) pure { x = xx; }
void bar() pure {}
static void spam() pure {}
}
void main() pure {
Foo f = Foo(1);
f.bar();
Foo.spam();
}
Comment #1 by bearophile_hugs — 2011-08-12T12:44:00Z
There is something I don't fully understand. The following code compiles with the improvements in DMD 2.055alpha/head, but it needs a "pure" or before "struct Map" (here#1) or at the front() method of Map (here#2). If both are removed it doesn't compile. So is the pure attribute for struct partially working already?
@property bool empty(T)(in T[] a) pure nothrow {
return !a.length;
}
@property ref T front(T)(T[] a) pure nothrow {
assert(a.length);
return a[0];
}
void popFront(A)(ref A a) pure nothrow {
assert(a.length);
a = a[1 .. $];
}
pure struct Map(alias fun, R) { // here#1
R _input;
this(R input) nothrow pure {
_input = input;
}
@property bool empty() nothrow const pure {
return _input.empty;
}
@property auto ref front() nothrow const { // here#2
return fun(_input.front);
}
void popFront() nothrow pure {
_input.popFront();
}
}
template map(alias fun) {
auto map(R)(R range) {
return Map!(fun, R)(range);
}
}
int sqr(int x) pure nothrow { return x * x; }
pure nothrow int foo(int n) {
int total;
foreach (x; map!(sqr)([1, 2, 3, 4]))
total += x;
return total;
}
void main() {
assert(foo(10) == 30);
}
Comment #2 by lt.infiltrator — 2014-03-19T19:21:22Z
Currently, instead of:
pure struct Foo { ... }
you can do:
struct Foo { pure: ... }
Is this acceptable?
Comment #3 by razvan.nitu1305 — 2022-08-15T14:49:28Z
Yes, you can use the `pure:` to obtain exactly what is requested. Closing as WONTFIX.