Variables

Hurdy variables work just as in Lua (can be global or local) and are scoped in the same way. However, unlike Lua, Hurdy does not default to global variables, bur rather requires variables to be explicitly declared as either local or global before they can be assigned to. The compiler will give an error if a variable is assigned to without declaring it first.

Note

This restriction only applies when assigning to variables. For all other cases they don’t need to be declared and if they have not been declared as local in the current scope they will be treated as free names and accessed from the current environment.

Local variables

Local variables are declared with the var keyword, and follow the regular rules of local variables in Lua.

var x -- declare variable, can be assigned to later
x = 2

var y = 5 -- declare and assign at the same time

var z = print -- this works even if print has not been declared

{
  var w = true -- w is only defined in here
}

w = false -- compiler will give an error, was not been declared in scope

The Lua code corresponding to

var x
x = 2

var y = 5

is

local x
x = 2

local y = 5

Just as in Lua, redaclaring a local variable shadows the previous definition within the current scope.

Multiple local variables can be declared/assigned to simoultaneously like in Lua:

var x, y = 1, 2, 3
var w, z

corresponds to the Lua code

local x, y = 1, 2, 3
local w, z

Note

Like in Lua, declaring a local variable without assiignin to it sets it to nil.

Global variables

Global variables are declared using the global keyword, and can only be declared if the identifier is not already local in the current scope.

global x -- declare variable, can be assigned to later
x = 2

global y = 5 -- declare and assign at the same time

var z = 3
global z -- compiler will give an error, z is already local in scope

{
  var w = true -- w is only defined in here
}

global w -- this is fine, w is not in scope

Multiple global variables can be declared/assigned to simoultaneously like in Lua:

global x, y = 1, 2, 3
global w, z

Note

Unlike local variables, declaring a local variable without assigning to it does not set its value, so it retains the value it already had (or nil if it has never been assigned to).