digitalmars.D.learn - Global variables read at compile time?
- "Stefan" <dlanglearnthrowaway thisisnotmyrealemail.com> Aug 15 2012
- "RommelVR" <daniel350 bigpond.com> Aug 15 2012
- "d_follower" <d_follower fakemail.com> Aug 15 2012
- "d_follower" <d_follower fakemail.com> Aug 15 2012
- "Jesse Phillips" <jessekphillips+D gmail.com> Aug 15 2012
- Andrej Mitrovic <andrej.mitrovich gmail.com> Aug 15 2012
- Justin Whear <justin economicmodeling.com> Aug 15 2012
- Leandro Motta Barros <lmb stackedboxes.org> Aug 15 2012
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
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
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
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
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
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
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
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
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









=?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> 