Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to verify your details, confirm your email, resolve issues, making threats, or asking for money, are
spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the
password reset link.
Due to spam on this forum, all posts now need moderator approval.
Entire forum
➜ MUSHclient
➜ Lua
➜ Defining global variables
Defining global variables
|
It is now over 60 days since the last post. This thread is closed.
Refresh page
Pages: 1 2
Posted by
| Batista
(15 posts) Bio
|
Date
| Sat 26 Aug 2006 12:09 AM (UTC) |
Message
| Okay, I already know that once the solution is posted I'll smack myself in the head and scream, "WHY DIDN'T I THINK OF THAT?!" But anywho...
For some reason, I'm having a ton of trouble trying to create a global variable in the script file. I'll readily admit that I'm a total newbie when it comes to using the script file, but I figured this would work:
global testvar = GetVariable("value")
or
global testvar
testvar = GetVariable("value")
I'm totally out of ideas. I'm not even sure if it's worth it. I'm wanting to save code time in triggers and aliases by not having to constantly redefine the same local variables I use in other scripts. :/ | Top |
|
Posted by
| Nick Gammon
Australia (23,140 posts) Bio
Forum Administrator |
Date
| Reply #1 on Sat 26 Aug 2006 12:51 AM (UTC) |
Message
|
Quote:
testvar = GetVariable("value")
All variables are global in Lua by default, so that is all you have to do.
Inside a function, you can localize a variable like this:
function test (blah)
local i, j = 5, 6
print (i, j)
foo = 42
end -- test
In this case both i and j are local to the function test. However foo is a global variable.
|
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Gore
(207 posts) Bio
|
Date
| Reply #2 on Mon 08 Jan 2007 01:47 PM (UTC) Amended on Mon 08 Jan 2007 01:48 PM (UTC) by Gore
|
Message
|
Quote: local i, j = 5, 6
I'm a complete lua newbie as well, what does that mean exactly? | Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #3 on Mon 08 Jan 2007 05:34 PM (UTC) |
Message
| That declares two local variables, i and j, and assigns 5 to i and 6 to j.
In Lua, a list of values assigned to a list of variables will assign them one by one in the same order as they're given; excess values are thrown away and if a variable has no value it is set to nil.
E.g. a,b = 1 means b will be nil.
a,b = 1,2,3 means that a==1, b==2 and the 3 is thrown away. |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Gore
(207 posts) Bio
|
Date
| Reply #4 on Tue 09 Jan 2007 03:17 PM (UTC) |
Message
| thanks a bunch, how come in the tutorial it says you declare a variable with var ::=name or somesuch, but you can use global name or local name here? | Top |
|
Posted by
| Meerclar
USA (733 posts) Bio
|
Date
| Reply #5 on Tue 09 Jan 2007 09:11 PM (UTC) |
Message
| Much like any other language, Lua offers several declaration methods for variables. What the tutorial offers is the "textbook" examples that most new users will be most comfortable learning because they offer the "most sound" programming structure. |
Meerclar - Lord of Cats
Coder, Builder, and Tormenter of Mortals
Stormbringer: Rebirth
storm-bringer.org:4500
www.storm-bringer.org | Top |
|
Posted by
| Gore
(207 posts) Bio
|
Date
| Reply #6 on Wed 10 Jan 2007 04:56 AM (UTC) |
Message
| Ahhh I see. What would be the most "correct" way of doing things, doesit not really matter?
| Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #7 on Wed 10 Jan 2007 05:43 AM (UTC) |
Message
| Generally you want all variables to be local unless they have to be global. It's cleaner, and avoids leaving variables all over the place. More importantly, it can prevent somewhat subtle bugs in code, if two functions rely on the same variable that should be local but gets modified somewhere else. |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Gore
(207 posts) Bio
|
Date
| Reply #8 on Wed 10 Jan 2007 06:07 AM (UTC) Amended on Wed 10 Jan 2007 06:47 AM (UTC) by Gore
|
Message
| So basically
var ::=variablename
Creates a global variable called variablename
variablename="whatever"
creates a global variable called variablename with the string "whatever" in it
local variablename="whatever"
does the same, but locally?
or even just
local variablename
global variablename
to make variables without anything in them?
target=""
Note (target)
function Target_Player (n,o,wildcard)
target=wildcard[1];
end
Weird, if I put a global before the target I get the error:
Error number: 0
Event: Compile error
Description: [string "Script file"]:73: `=' expected near `target'
Called by: Immediate execution
| Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #9 on Wed 10 Jan 2007 07:54 AM (UTC) |
Message
| I've never seen Lua use the ::= notation. You don't need it, in any case. You might be confusing it with the manual's statement of the language grammar, e.g.
Quote:
stat ::= varlist1 `=´ explist1
varlist1 ::= var {`,´ var}
explist1 ::= exp {`,´ exp}
Those aren't actually Lua statements; it's a meta-statement, if you will, describing what Lua code looks like.
If you don't prefix the first use of a variable in a given lexical scope with local, then it is global.
e.g.
local foo = 2 -- foo is now local in this scope
fo = 3 -- oops, created a new global variable
There is no way that I know of to create an empty global variable, other than perhaps just:
someglobal = nil
but I'm not sure why you'd want to do that.
However, typing just
local foo
means that from that point on in the lexical scope, foo will be local. |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Gore
(207 posts) Bio
|
Date
| Reply #10 on Wed 10 Jan 2007 09:08 AM (UTC) |
Message
| Ah heh. On my old mud, I would use a ton of variables for different things, on Lua is it worth it to group which variables I can by tables?
Say, if I have 4 variables for targetting, should I make a targetting table?
dim target, target_one, target_two, target_three
target =
{
cur = "",
one = "",
two = "",
three = "",
}
or is it not worth it? or is it more of a "do whatever you want" type of thing? heh | Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #11 on Wed 10 Jan 2007 04:09 PM (UTC) |
Message
| I guess it depends. Having a table can make it easier to pass around a bunch of variables at the same time. It also lets you group things, which might be useful in some circumstances. Either way the usefulness is stylistic, not functional, I think. (But don't underestimate the importance of correct/good style.) Just do what makes the most sense to you, I suppose. :) |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Nick Gammon
Australia (23,140 posts) Bio
Forum Administrator |
Date
| Reply #12 on Thu 11 Jan 2007 03:26 AM (UTC) |
Message
|
Quote:
or even just
local variablename
global variablename
...
Weird, if I put a global before the target I get the error:
There is no "global variablename" syntax - you can forget that, it was a guess by the original poster.
Variables are global by default (strictly speaking, they are looked up in the environment table that applies to the current function).
However if, in the lexical scope of a variable reference, that variable has been declared local, or is a function argument, then no table lookup occurs and the local variable is used.
You can't just look at a line like this:
a = 42
... and assume a global variable is being created/assigned. You would need to see if, further back, there was a local statement declaring "a", or if it is a function argument to the current function, or a parent function.
Quote:
... to make variables without anything in them?
There is no way of making a global variable with nothing in it. Doing this for example, simply deletes a current global variable, if one exists:
a = nil
It does not create an "empty" variable named "a".
You can, however make an empty local variable, eg.
local a = nil
In this case "= nil" is redundant, it would default to nil.
|
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Nick Gammon
Australia (23,140 posts) Bio
Forum Administrator |
Date
| Reply #13 on Thu 11 Jan 2007 03:32 AM (UTC) |
Message
|
Quote:
Say, if I have 4 variables for targetting, should I make a targetting table?
The usefulness of a table like you describe is, that you can pass the table around, as the table reference is passed (eg. to function calls).
So you could have:
function f (t)
t.one = "Nick"
end -- function f
target =
{
cur = "",
one = "",
two = "",
three = "",
}
f (target)
print (target.one) --> Nick
However without using the table, parameters are passed by value, and this would not work:
function f (x)
x = "Nick"
end -- function f
local target, target_one, target_two, target_three
f (target_one)
print (target_one) --> nil
In this case we are passing target_one down *by value* and not by reference, so changing it inside a function merely changes the local copy. You may not want this.
Effectively, inside function f, the variable x is local, however it is initialized with the value that the function caller gives it.
|
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| Gore
(207 posts) Bio
|
Date
| Reply #14 on Thu 11 Jan 2007 04:59 AM (UTC) |
Message
| Lua is so much neater and more interesting than vbscript. | Top |
|
The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).
To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.
72,382 views.
This is page 1, subject is 2 pages long: 1 2
It is now over 60 days since the last post. This thread is closed.
Refresh page
top