Thread overview | ||||||
---|---|---|---|---|---|---|
|
July 16, 2010 Anyone know why this CTFE isn't working? | ||||
---|---|---|---|---|
| ||||
Attachments: | import std.stdio; struct State { string s; string getString() { return s; } static State opCall(string s) { State ret; ret.s = s; return ret; } } void main() { auto s = State("adf"); pragma(msg, s.getString()); } dmd Output: (line 14 is the pragma statement) struct.d(14): Error: variable s cannot be read at compile time struct.d(14): Error: cannot evaluate s.getString() at compile time s.getString() www.neonova.co.za: http://cf.neonova.co.za/9Tdf View: https://mail1.clearformat.com/vcard.php?uid=11&pid=10 Beta Test Advert: http://fwd.clearformat.com/9Tdd |
July 16, 2010 Re: Anyone know why this CTFE isn't working? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rory McGuire | On Fri, 16 Jul 2010 11:46:48 +0200, Rory McGuire wrote:
> import std.stdio;
>
> struct State {
> string s; string getString() { return s; } static State opCall(string
> s) {
> State ret;
> ret.s = s;
> return ret;
> }
> }
>
> void main() {
> auto s = State("adf");
> pragma(msg, s.getString());
> }
>
> dmd Output: (line 14 is the pragma statement)
>
> struct.d(14): Error: variable s cannot be read at compile time
> struct.d(14): Error: cannot evaluate s.getString() at compile time
> s.getString()
It's not working because s isn't a compile-time quantity. Try:
enum s = State("adf");
-Lars
|
July 16, 2010 Re: Anyone know why this CTFE isn't working? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Lars T. Kyllingstad | On Fri, 16 Jul 2010 11:58:57 +0200, Lars T. Kyllingstad <public@kyllingen.nospamnet> wrote:
> On Fri, 16 Jul 2010 11:46:48 +0200, Rory McGuire wrote:
>
>> import std.stdio;
>>
>> struct State {
>> string s; string getString() { return s; } static State opCall(string
>> s) {
>> State ret;
>> ret.s = s;
>> return ret;
>> }
>> }
>>
>> void main() {
>> auto s = State("adf");
>> pragma(msg, s.getString());
>> }
>>
>> dmd Output: (line 14 is the pragma statement)
>>
>> struct.d(14): Error: variable s cannot be read at compile time
>> struct.d(14): Error: cannot evaluate s.getString() at compile time
>> s.getString()
>
> It's not working because s isn't a compile-time quantity. Try:
>
> enum s = State("adf");
>
> -Lars
Awesome thanks, worked.
So is the difference that "auto s" is a Struct which can change whereas "enum s" is a constant?
If it is a constant its just "s" that is constant right?
Thanks Lars
-Rory
|
July 16, 2010 Re: Anyone know why this CTFE isn't working? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rory McGuire | On Fri, 16 Jul 2010 12:12:38 +0200, Rory McGuire wrote:
> On Fri, 16 Jul 2010 11:58:57 +0200, Lars T. Kyllingstad <public@kyllingen.nospamnet> wrote:
>
>> On Fri, 16 Jul 2010 11:46:48 +0200, Rory McGuire wrote:
>>
>>> import std.stdio;
>>>
>>> struct State {
>>> string s; string getString() { return s; } static State
>>> opCall(string s) {
>>> State ret;
>>> ret.s = s;
>>> return ret;
>>> }
>>> }
>>>
>>> void main() {
>>> auto s = State("adf");
>>> pragma(msg, s.getString());
>>> }
>>>
>>> dmd Output: (line 14 is the pragma statement)
>>>
>>> struct.d(14): Error: variable s cannot be read at compile time
>>> struct.d(14): Error: cannot evaluate s.getString() at compile time
>>> s.getString()
>>
>> It's not working because s isn't a compile-time quantity. Try:
>>
>> enum s = State("adf");
>>
>> -Lars
>
> Awesome thanks, worked.
>
> So is the difference that "auto s" is a Struct which can change whereas
> "enum s" is a constant?
> If it is a constant its just "s" that is constant right?
>
> Thanks Lars
Yes. Writing "auto s = State("adf");" is equivalent to writing
State s = State("adf");
and since s can change at runtime, it would be meaningless to say that it has a value at compile time. However, its *initial value*, the struct literal State("adf"), is known at compile time -- otherwise it would be impossible to assign it to an enum.
And actually, an enum is not only a constant, it is a manifest constant. When you declare "enum x = someFixedValue", the compiler will just replace all later uses of x with someFixedValue. It's basically the same as using the literal value in those places.
This has the consequence that you can't take the address of an enum, nor pass an enum by reference. Doing
enum i = 3;
int* p = &i;
is equivalent to
int* p = &3;
which doesn't make sense.
-Lars
|
Copyright © 1999-2021 by the D Language Foundation