www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Global variables read at compile time?

reply "Stefan" <dlanglearnthrowaway thisisnotmyrealemail.com> writes:
Hi there, I'm having trouble getting the following code to 
compile:

import std.stdio;

string a = "a";
string b = a;

void main()
{
     writeln(b);
}

DMD spits out the error "test.d(4): Error: variable a cannot be 
read at compile time". Is there any way to tell the compiler I 
want b evaluated at runtime, or am I missing something obvious 
here?
Aug 15 2012
next sibling parent reply "RommelVR" <daniel350 bigpond.com> writes:
On Wednesday, 15 August 2012 at 13:36:26 UTC, Stefan wrote:
 Hi there, I'm having trouble getting the following code to 
 compile:

 import std.stdio;

 string a = "a";
 string b = a;

 void main()
 {
     writeln(b);
 }

 DMD spits out the error "test.d(4): Error: variable a cannot be 
 read at compile time". Is there any way to tell the compiler I 
 want b evaluated at runtime, or am I missing something obvious 
 here?

Make a an enum, const or otherwise immutable.
Aug 15 2012
parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 08/15/2012 06:55 AM, d_follower wrote:
 On Wednesday, 15 August 2012 at 13:41:10 UTC, RommelVR wrote:
 Make a an enum, const or otherwise immutable.

I don't think you understood the question.

I thought RommelVR did understand the question. Try this: import std.stdio; enum a = "a"; string b = a; void main() { writeln(b); } Ali -- D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html
Aug 15 2012
prev sibling next sibling parent "d_follower" <d_follower fakemail.com> writes:
On Wednesday, 15 August 2012 at 13:41:10 UTC, RommelVR wrote:
 Make a an enum, const or otherwise immutable.

I don't think you understood the question.
Aug 15 2012
prev sibling next sibling parent "d_follower" <d_follower fakemail.com> writes:
On Wednesday, 15 August 2012 at 13:36:26 UTC, Stefan wrote:
 Hi there, I'm having trouble getting the following code to 
 compile:

 import std.stdio;

 string a = "a";
 string b = a;        // line 4

 void main()
 {
     writeln(b);       // line 8
 }

 DMD spits out the error "test.d(4): Error: variable a cannot be 
 read at compile time". Is there any way to tell the compiler I 
 want b evaluated at runtime, or am I missing something obvious 
 here?

You must understand that your problem lies in line 4, not in line 8, i.e. the following doesn't work either: string a = "a"; string b = a; I don't really know why, but it seems that you can only initialize globals with constants. What you could do is something like this (I guess): enum value = "a"; string a = value; string b = value; void main() { writeln(b); b = "b"; writeln(b); }
Aug 15 2012
prev sibling next sibling parent "Jesse Phillips" <jessekphillips+D gmail.com> writes:
On Wednesday, 15 August 2012 at 13:36:26 UTC, Stefan wrote:
 Hi there, I'm having trouble getting the following code to 
 compile:

 import std.stdio;

 string a = "a";
 string b = a;

 void main()
 {
     writeln(b);
 }

 DMD spits out the error "test.d(4): Error: variable a cannot be 
 read at compile time". Is there any way to tell the compiler I 
 want b evaluated at runtime, or am I missing something obvious 
 here?

untested string a = "a"; static this() { string b = a; } be aware of the details: http://dlang.org/module.html#staticorder
Aug 15 2012
prev sibling next sibling parent Andrej Mitrovic <andrej.mitrovich gmail.com> writes:
On 8/15/12, d_follower <d_follower fakemail.com> wrote:
 I don't really know why, but it seems that you can only
 initialize globals with constants.

That's what the static constructor is for: http://dlang.org/class.html#StaticConstructor http://dlang.org/class.html#SharedStaticConstructor
Aug 15 2012
prev sibling next sibling parent Justin Whear <justin economicmodeling.com> writes:
On Wed, 15 Aug 2012 15:36:24 +0200, Stefan wrote:

 Hi there, I'm having trouble getting the following code to compile:
 
 import std.stdio;
 
 string a = "a";
 string b = a;
 
 void main()
 {
      writeln(b);
 }
 
 DMD spits out the error "test.d(4): Error: variable a cannot be read at
 compile time". Is there any way to tell the compiler I want b evaluated
 at runtime, or am I missing something obvious here?

D is not as context-sensitive as what you may be used to. This is a feature to make the language more parseable and human-grokable. Basically, the result of a module-level assignment should not depend on what came before, so this example code is invalid: string a = "a"; a = "b"; string b = a; This would require the declaration of b to depend on the order of the declarations/statements which come before it. When you add in the import of modules, things would get really hairy really fast. So module-level declarations must use constant expressions (literals or symbols to constant data) in their initialization. Justin
Aug 15 2012
prev sibling parent Leandro Motta Barros <lmb stackedboxes.org> writes:
Another option is to use "module constructors", as shown below. (But
somehow this all looks a bit fishy for me...)

LMB

----

import std.stdio;

string a = "a";
string b;

static this()
{
   b = a;
}

void main()
{
   writeln(b);
}


On Wed, Aug 15, 2012 at 11:03 AM, d_follower <d_follower fakemail.com> wrote:
 On Wednesday, 15 August 2012 at 13:36:26 UTC, Stefan wrote:
 Hi there, I'm having trouble getting the following code to compile:

 import std.stdio;

 string a = "a";
 string b = a;        // line 4

 void main()
 {
     writeln(b);       // line 8

 }

 DMD spits out the error "test.d(4): Error: variable a cannot be read at
 compile time". Is there any way to tell the compiler I want b evaluated at
 runtime, or am I missing something obvious here?

You must understand that your problem lies in line 4, not in line 8, i.e. the following doesn't work either: string a = "a"; string b = a; I don't really know why, but it seems that you can only initialize globals with constants. What you could do is something like this (I guess): enum value = "a"; string a = value; string b = value; void main() { writeln(b); b = "b"; writeln(b); }

Aug 15 2012