Meet Hurdy#

Hurdy is a scripting language that compiles to Lua. Its main features are:

  • C-style brackets to make the language less verbose by removing the need for keywords such as then, end, and do.

  • No global-by-default for variable declarations. Variables must explicitly be declared as local or global before they can be assigned to.

  • Works with Lua 5.1 and higher, as well as LuaJIT (some features only work when the compiled code is run with a more recent version of Lua).

  • Lua module to load Hurdy files and compile them on the fly, which includes a way to remap error lines to the original Hurdy code on runtime errors.

  • Outputs human-readable Lua code without creating additional unexpected Lua objects on compilation—what you mean is what you get.

  • Additional assignment operators (such as addition assignment).

The following Hurdy code highlights the main features of the language.

----------------
-- Hurdy code --
----------------

print("Hello, world!")

-- Python-style import statement for quickly declaring and assign
-- local variables from the entries of a table
from table import sort as tSort

-- entries of a table constructor can be separated by commas or newlines
global t = {
    1
    3
    2
}

-- method-like functions have a reserved keyword
var method sortMethod() {
    tSort(self)
}
t.sortMethod = sortMethod

-- brackets are optional for functions with a single statement
function t.sortFunction()
    tSort(t)

for i = 1, 10 {  print(i) }

-- brackets are optional for loops with a single statement
for i = 1, 10
    print(i)

while true {
    print("infinite loop!")
    break -- joking!
}

-- variables must be declared as either local (var) or global before they can be assigned to
var x = 1
global y
y = print

-- addition assignment, multiplication assignments, etc.
x += 5
x *= 7

-- default arguments can be specified on function declarations
var f = function(x, y=3) {
    print(x, y)
}

-- Hurdy includes a continue statement, but it only works in LuaJIT and Lua 5.2+
-- since it relies on Lua's goto statement
for i, v in ipairs(t) {
    if i == 2 continue
    print(i, v)
}

-- Bitwise operators are supported (code must be run with Lua 5.3+)
x = x & 2
x |= 7

The code above compiles to the following Lua code:

print("Hello, world!");
local _hurdytemp1 = table
local tSort = _hurdytemp1.sort
t = {
  1,
  3,
  2
};
local sortMethod;
sortMethod = function(self)
  tSort(self);
end;
t.sortMethod = sortMethod;
t.sortFunction = function()
  tSort(t);
end;
for i = 1, 10 do
  print(i);
end
for i = 1, 10 do
  print(i);
end
while true do
  print("infinite loop!");
  do break end;
end
local x = 1;
y = print;
x = x + (5);
x = x * (7);
local f = function(x, y)
  if y == nil then y = 3 end
  print(x, y);
end;
for i, v in ipairs(t) do
  do
    if i == 2 then
      goto continue;
    end
    print(i, v);
  end
  ::continue::;
end
x = x & 2;
x = x | (7);