Skip to content
/ allelua Public

๐Ÿ™ LuaJIT distribution blessed by programming gods.

License

Notifications You must be signed in to change notification settings

negrel/allelua

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ™ allelua - LuaJIT distribution blessed by programming gods

allelua is a Lua runtime with secure defaults and a great developer experience. It's built on mlua, Rust and Tokio.

Features

Here's what makes allelua a unique alternative to language like Python and runtimes like Deno / NodeJS:

  • Fast and resources efficient: LuaJIT is extremely fast and lightweight.
  • Simple:
    • Lua is a lot simpler than other scripting language
    • Stable, based on Lua 5.1 with a few 5.2 compatibility features, core language won't change or will remains 100% compatible
  • Easy concurrency:
    • No async/await
    • Write concurrent code like single threaded code using structured concurrency
  • Secure by default (planned)
  • Batteries included:
    • Linter
    • Formatter
    • LSP
    • Package manager (planned)
    • Task runner (planned)
    • Test runner
    • Benchmarking tool
    • Documentation generator (wip)
    • Type checker (wip)
  • FFI support (planned)

Our goal is to transform Lua, originally designed as an embeddable scripting language, into a full-fledged, independent programming language capable of standalone use.

Examples

Here are a few examples:

Structured concurrency

allelua supports structured concurrency built on top of Tokio. If you're unfamiliar with structured concurrency and why unstructured concurrency isn't supported read this article: Notes on structured concurrency, or: Go statement considered harmful

coroutine.nursery(function(go)
    go(f, x, y, z)
    -- or
    go(function()
        f(x, y, z)
    end)
end)

starts a new goroutine running

f(x, y, z)

A goroutine is a lightweight thread managed by the allelua runtime. But unlike, Go's goroutine, they can only be spawned in coroutine.nursery() function. Also when coroutine.nursery() returns, all goroutines have finished to execute.

Here is an example proving that goroutines runs concurrently:

local time = require("time")

coroutine.nursery(function(go)
    local now = time.Instant:now()
    for i = 1, 3 do
        go(function()
            time.sleep(1 * time.second)
            print("goroutine", i, "done in", now:elapsed())
        end)
    end
end)

prints

goroutine 1 done 1.001s
goroutine 2 done 1.001s
goroutine 3 done 1.001s

If goroutines were run one after another, they would print:

goroutine 1 done 1.001s
goroutine 2 done 2.001s
goroutine 3 done 3.001s

Shell scripts

Allelua is legacy-free and breaks compatibility with standard Lua. We provide our own standard library with handy modules such as sh that provides a DSL for shell scripting:

local os = require("os")

coroutine.nursery(function(go)
    local sh = require("sh").new(go)

    -- Pipe ls stdout into tr.
    -- ls -l | tr [a-z] [A-Z]
    local output = sh.ls("-l"):tr("[a-z]", "[A-Z]"):output()

    -- Pass io.Reader as stdin.
    -- You can also redirect stdout and stderr to io.Writer.
    local f = os.File.open("/path/to/file", { read = true })
    output = tr({ stdin = f }, "[a-z]", "[A-Z]"):output()
    print(output)
end)

Contributing

If you want to contribute to allelua to add a feature or improve the code contact me at [email protected], open an issue or make a pull request.

๐ŸŒ  Show your support

Please give a โญ if this project helped you!

buy me a coffee

๐Ÿ“œ License

MIT ยฉ Alexandre Negrel

About

๐Ÿ™ LuaJIT distribution blessed by programming gods.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages