7 ms·
Lua for Elixir
- rvirding 1y agoThe reason for calling it Luerl was that it was/is an implementation of Lua on Erlang. It is Dave who has been working with a more serious Elixir interface. The original one, which still exists, had a very simple Elixir interface module which just flipped the argument ordering to calls to be more Elixiry in feel.
- antfarm 1y agoLua on the BEAM - Dave Lucia & Robert Virding | Code BEAM Europe 2024 https://www.youtube.com/watch?v=4YBBoXXH_98 https://www.youtube.com/watch?v=4YBBoXXH_98
- joshprice 1y agoThis is awesome! Can't wait to find some use cases to embed a sandboxed and safe mini Lua language in our apps. https://hexdocs.pm/lua/Lua.html https://hexdocs.pm/lua/Lua.html
- davydog187 1y agoThanks Josh, hope to see you soon, its been a while
- joshprice 1y agoLikewise! ElixirConfUS?
- davydog187 1y agoProbably not, you should come to Code BEAM NYC, although a bit of a trek for you. I will be trying to travel more in 2026
- xvilka 1y agoThere is also Lua implementation in safe Rust - Piccolo[1] [1] https://github.com/kyren/piccolo https://github.com/kyren/piccolo
- behnamoh 1y agoRecently, I had a simple Flask project, just a single Python file, and wanted to convert it to Elixir using AI. But what I got was a sprawling directory of modules and files in Elixir. Apparently, that’s just how things are done in the Elixir world. That moment made me realize why some languages catch on while others struggle. If spinning up a basic web server already feels like jumping through hoops, I can’t imagine the overhead for more complex projects. I'm sure there are people who think Elixir/Phoenix >> <other-solutions>, but for me it was a nightmare. OTOH, the language is beautiful as it's macros all the way down.
- devoutsalsa 1y agoYou can write a single file Elixir app if you want to. There's nothing preventing this. Setting up a simple web server w/ Plug is straightforward. You'll have the same problems you'd have with a non-trivial Flask app, which is that scrolling through a huge file is a pain.
- johnisgood 1y agoMy only issue when it comes to Erlang and Elixir (or Java and Kotlin) is that there are just so many files I need to open and keep track of. I do not blame the languages, of course, but it is the reason for why I use Go for less serious projects instead of Erlang / Elixir, because in Go it would typically be contained in one file, whereas in Elixir it would span across multiple files.
- ffsm8 1y agoYou gotta be trolling... You're literally responding to someone pointing out you don't need multiple files in elixir. And the same is true for Java and kotlin. Heck even the official spring boots demo videos define everything in a single file nowadays. Multiple files is just a convention, because otherwise your project will become unhandy eventually. That applies to Go as well.
- johnisgood 1y ago
- rickcarlino 1y agoWe used Luerl, the underlying Lua engine, in production for years as a sandboxed scripting environment for FarmBot devices back in the day. Users could execute scripts directly on the device to control peripherals. It was a solid library and the community support was great. From an ergonomics perspective, developers preferred this approach over API calls. I am surprised more projects don’t provide a Lua scripting layer.
- benwilber0 1y ago> I am surprised more projects don’t provide a Lua scripting layer. Completely agree. I've been adding Lua scripting support to pretty much everything I make now. Most recently my programmable SSE server [1]. It's extended the functionality far beyond anything that I would have had the time and patience to do myself. Lua is such a treat. [1] https://github.com/benwilber/tinysse https://github.com/benwilber/tinysse
- helpfulContrib 1y ago>Lua is such a treat. It sure is. I've been using Lua professionally and personally for some decades now, and I think that there is no need to be surprised that more projects don't provide a Lua scripting layer, because actually, Lua is everywhere. And the scripting aspect is one thing - but its not the only reason to use Lua. Lua is so easily embeddable and functionally productive as a development tool, its not always necessarily necessary to have this layer exposed to the user. Sure, engines and things provide scripting, and that is a need/want of the respective markets. Who doesn't love redis, et al.? But Lua can be put in places where the scripting aspect is merely a development method, and in the end shipped product, things are tightly bound to bytecode as an application framework beyond scripting. The point being, Lua is such a treat that it is, literally, in places you might least expect - or at least, will find under a lot of covers. And after all, thats the beauty of it: as an embedded language/VM/function interface, Lua can sure scale to different territories.
- Philpax 1y agoVery nice, but it is confusing to name a library for using a language the same thing as that language. I suppose this is meant to be a temporary state of affairs while Lua (the library) gets merged into Luerl, but I would have personally called it Luerl++ or such.
- davydog187 1y agoAuthor here! Luerl++ is not a valid module name :) More seriously, I considered alternate names, but settled on this because it was short, literal, and given that its in the context of Elixir, makes sense when using it. As you stated, the hope is to consolidate it into Luerl at some point
- antfarm 1y agoHave you considered "Luex", a nod to Luerl but with the typical Elixir suffix?
- deleted 1y ago[deleted]
- shakna 1y agoHumble appeal, because they'd win instantly: Please don't steal my useless project's name [0]. [0] https://luarocks.org/modules/shakna-israel/luaex https://luarocks.org/modules/shakna-israel/luaex
- davydog187 1y agoI have a personal mission to never name any libraries with the -ex prefix
- tommica 1y agoCurious, why?
- 1y ago
- davydog187 1y agoIf you're looking for a cool example of Lua running on the BEAM, check out the creator of Luerl (Robert Virding) space ship demo https://github.com/rvirding/ship-demo https://github.com/rvirding/ship-demo
- antfarm 1y agoHere is a video demo: https://www.youtube.com/watch?v=NC8Xl6tvjfk https://www.youtube.com/watch?v=NC8Xl6tvjfk Some instructions to install it on macOS: https://erlangforums.com/t/lt-using-luerl-to-run-spaceships-robert-virding-code-beam-europe-2024/4196/3 https://erlangforums.com/t/lt-using-luerl-to-run-spaceships-...
- gilgamesh3 1y agoCool project, congrats. I am trying to understand why would anyone prefer to use Lua to create script instead of Elixir, which supports running scripts. While Lua has lots of users the language just have too many wrong design choices. If I had the choice between Elixir and Lua for scripts I would use Elixir every time.
- deleted 1y ago[deleted]
- prophesi 1y agoI would also personally prefer Elixir to Lua, but this would be great for allowing isolated/sandboxed BEAM processes to execute Lua code from your end users whom are likely unfamiliar with Elixir. As mentioned in the article, this is precisely what TV Labs uses it for to allow smart tv app developers to write and run tests for their apps. https://docs.tvlabs.ai/scripting/introduction/getting-started https://docs.tvlabs.ai/scripting/introduction/getting-starte...
- victorbjorklund 1y agoThis is more for your apps users. Like lets say you have a CRM saas written in Elixir. Then you can allow your users to script things in your app with Lua. If you allow them to use Elixir running in your app you might allow someone to hack your app.
- rdtsc 1y agoLua can help if you're handing this over to someone else not just devs who know Elixir. Also, as the sibling post mentioned, in this case Lua is completely interpreted in an Erlang process. That allows a good amount of sandboxing, they have isolated heaps already and you can control memory limits and other resource usages, and all that in a relatively tiny footprint of a few KBs.
- davydog187 1y agoElixir is not a sandboxed language, so you can't just accept arbitrary Elixir programs from users and execute them inside of your application without security concerns. Lua, on the other hand, can be executed in a sandboxed fashion, limiting and constraining the reach of user programs. Check out Anthony Accomazzo's post about Mini-Elixir, which does a great job breaking this down much further https://blog.sequinstream.com/why-we-built-mini-elixir/ https://blog.sequinstream.com/why-we-built-mini-elixir/
- dpflan 1y agoIs this influenced by "Embedding Python in Elixir"? https://dashbit.co/blog/running-python-in-elixir-its-fine https://dashbit.co/blog/running-python-in-elixir-its-fine It certainly is more attractive in implementation. Well done!
- davydog187 1y agoBoth the Lua library and Luerl predate Pythonx. I started this library nearly 2 years ago, its only now that I'm releasing a stable version. However, Pythonx was originally created by a member of our team, Cocoa, who built it in her own free time. The Livebook team forked her project, conceptually, and released it. https://github.com/cocoa-xu/pythonx https://github.com/cocoa-xu/pythonx
- dpflan 1y agoVery cool, thank you both for your contributions!
- codingbear 1y agowhat is the Lua equivalent for JVM ecosystem? An embeddable language which you allows for running user scripts in a sandbox?
- cess11 1y agoLuaJ, or Luna if you're brave. You can likely achieve something similar with other languages that runs on the JVM, like Kawa, Clojure or Jython.
- iLemming 1y agoDoes that mean I can now write Fennel to target BEAM?
- davydog187 1y agoThere is a fennel channel in the discord/slack if you're interested. I'm not sure how successful it has been
- johnisgood 1y agoFennel compiles to Lua, so theoretically it should work. You should be able to do anything Lua does, run on any Lua interpreter, and use any Lua library.
- jkaufmann_ 1y agoI have been waiting for this my whole life
- binary132 1y agoHow sandboxed is BEAM really?
- cmdrk 1y agoMy understanding is that Luerl can remove various modules from being used, like preventing use of the IO library for instance. I would say BEAM itself is not particularly sandboxed, and certainly clusters of Erlang nodes assume a lot of shared trust.
- rdtsc 1y agodavydog187, I just wanted to thank you for stepping up and lending Robert a hand. It's nice to see new releases and lots of cleanups happening in Luerl. The project is a real gem and it's nice to see new activity in it!
- davydog187 1y agoThanks, I really appreciate that. While its not my main focus by any means, its been a really fun project to chip away at (both the higher level library and Luerl itself). I do think that it has the potential to be really great with continued investment
- interroboink 1y agoThis is not embedding the C Lua runtime and compiler, but rather a complete implementation of Lua 5.3. This feat is made possible by the underlying Luerl library, which implements a Lua parser, compiler, and runtime, all in Erlang. Okay, that's actually pretty cool (: Also a sign of Lua's maturity and popularity, that it's got various independent implementations (LuaJIT, this one, perhaps others I don't know about).
- johnisgood 1y agoLuaJIT is definitely amazing.
- pentacent_hq 1y agoI've been considering adding Lua support to Keila for a while already. It seems like a perfect fit for when I'm going to implement email automation and want to allow custom business logic. This would certainly make that plan easier. Thanks OP for sharing the library with the community!
- davydog187 1y agoLet me know if you have any questions, I'd be happy to assist
- _acco 1y agoThis is so cool. A key benefit is that it's not embedding the C Lua runtime and compiler, but rather implements Lua in the host language (Elixir/Erlang). When sandboxing user code in another runtime, you need to serialize the data to and from that runtime. That comes with a performance penalty. So, for example, if you sandbox code in WASM, you need to pick a transport data format, like JSON. You need to serialize Elixir data structures into JSON, send it to WASM, and then deserialize the result. For a high-performance data pipeline, this adds up! But if your sandbox is in the host language, no serialization/de-serialization is required. You can execute the sandboxed language in microseconds. I wrote more about this here: https://blog.sequinstream.com/why-we-built-mini-elixir/ https://blog.sequinstream.com/why-we-built-mini-elixir/ Wish this library existed just a couple months ago!
- dlojudice 1y agoFun fact (probably well-known fact for HN audience): Both Lua and Elixir were created by Brazilians. Lua by Roberto Ierusalimschy and team at PUC-Rio in 1993, and Elixir by José Valim in 2011