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 reply "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
parent reply =?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
parent reply "Suliman" <evermind live.ru> writes:
I have got same error. I need to pass in instance of class 
constant, but got error "Error: static variable  cannot be read 
at compile"

http://www.everfall.com/paste/id.php?1mc9mb9cxyie

When I had create instance of class in main, and create 
confvarible above it all worked, but when I had moved it's in 
module I got error.
May 06 2014
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 05/06/2014 03:16 AM, Suliman wrote:

 When I had create instance of class in main, and create confvarible
 above it all worked, but when I had moved it's in module I got error.

There is module 'static this()' for such runtime initialization: Config config; static this() { config = new Config(confname); if (config.isconfigexists()) writeln("config exist"); else writeln("config do not exists"); } void main() {} Ali
May 06 2014
parent reply "Suliman" <evermind live.ru> writes:
Thanks! But is there any other solution? I am thinking that I am 
trying to specify config name by wrong way...
May 06 2014
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 05/06/2014 07:40 AM, Suliman wrote:
 Thanks! But is there any other solution? I am thinking that I am trying
 to specify config name by wrong way...

Sorry, I don't understand what exactly you are trying to do. :( Is config file a compile-time concept? Do you want to read it at compile time? You can also include the contents of a file at compile-time: import ("somefile.d") The compiler will read the file and insert its contents where the import statement appears. On the other hand, if it is available only at run-time, you obviously have to read it at run time. Ali
May 06 2014
parent "Suliman" <evermind live.ru> writes:
I am tying to hardcode name of config file name. Then I would 
read and parse it.
May 06 2014
prev sibling next sibling parent reply "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
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 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
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 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