Library / SDK
LuxLang/lux avatar
LuxLang/lux

Lux Programming Language: Multi-Platform Functional Lisp

The Lux Programming Language

1,748 stars57 forksEmacs LispApache-2.0

At a glance

What is it?
Lux is a functional, statically typed Lisp designed for the JVM, JavaScript, Python, Ruby, and Lua. The repository documents substantial compiler and standard-library work, but the README also labels the language as beta.
Who is it for?
Lux fits developers who want a typed Lisp that can target several runtimes and who are comfortable with a language still identified as beta. It is a poor first choice for teams that require a documented installation path, a settled production status, or consistent platform behavior today.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 14 days ago.
What is it written in?
Mainly Emacs Lisp, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • LuxLang/lux1,748 ★ · +2
Star history
Repository2026-10-162026-10-23
LuxLang/lux1.7k1.7k

2 Stars in the last 7 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

Lux's Target Use Cases and Language Design

Lux addresses programmers who want functional programming with static typing and Lisp syntax while retaining the ability to run code on more than one execution environment. Its intended users are not limited to Java developers. The README describes compilation to JVM bytecode, JavaScript, Python, Ruby, and Lua, which makes the language relevant to desktop, server, scripting, and mixed-language projects where a shared implementation is useful.

The syntax is inspired by Clojure, functional programming by Haskell, and polymorphism by Standard ML. This combination places Lux between a Clojure-like Lisp and a statically typed functional language. The README does not present a small tool for one narrow task. Instead, it describes a general-purpose language intended for functional code, code generation, macros, and libraries that can be consumed from each supported target platform.

That breadth is also a warning. Multi-platform support does not mean that every runtime is equally mature or that the same source can be moved without checking platform-specific modules. The README says that support for JavaScript, Python, Lua, and Ruby has been added, but it does not claim identical feature coverage for every backend. Developers choosing Lux should therefore treat the JVM as the best documented starting point, since that is the backend described as pretty stable and the repository contains a `lux-jvm/` entry.

Compilation Targets and Polyglot Library Use

Lux compiles JVM source into bytecode, allowing programs to run wherever Java can run. The repository also contains separate directories for the other backends, including `lux-js/`, `lux-python/`, `lux-ruby/`, `lux-lua/`, `lux-php/`, and `lux-r/`. Those directory names show that the repository layout has distinct implementation areas rather than a single runtime-independent source tree.

The README makes a further claim about libraries. Lux code can be compiled into libraries for any platform Lux can compile to. That supports a polyglot workflow: a Lux library could be exposed to a JavaScript, Python, Ruby, or Lua consumer instead of requiring that consumer to rewrite the entire component. The same section describes Lux as glue code for polyglot projects, although that language does not provide compatibility details for a particular library.

The compiler documentation is in `documentation/`, while `compilers.md` is a repository entry that may contain backend-specific implementation notes. The README does not show how a single command selects a target, how generated artifacts are named, or whether every standard-library module can be compiled for every backend. Those omissions matter to adoption. A cross-platform language is valuable only if the target-specific path is predictable, and the README does not establish that predictability.

Macros, Types, and Compiler Extensibility

Lux's most distinctive documented mechanism is its monadic macro system. The README says that macros differ from those in most other Lisps because they are monadic. The `(Meta a)` type threads `Lux` compiler-state instances through a macro, allowing macro actions to participate in compiler operations rather than being treated only as ordinary value transformations.

Lux provides `macro` for defining these macros and `syntax` for monadic parsing of `Code` tokens. The exact source-level workflow is not included in the README, so the documentation does not show enough code to reproduce a macro from this description alone. The important architectural point is that compiler state is explicit in the macro interface. That can support code manipulation that depends on compiler context, but it also places more responsibility on macro authors.

The type system is similarly designed around programmable data. The README says types are plain-old data structures whose expressions are evaluated by the compiler and integrated into the type checker. Functions and macros can therefore generate types, and macros can access types to generate code. This creates a connection between metaprogramming and typing rather than treating macros as a separate, untyped layer.

Compiler extension goes further. The documentation says that compiler extensions can alter syntax, language semantics, optimizations, and code-generation mechanisms. An experimental meta-compiler architecture is also mentioned. These are substantial design commitments, but the README does not document extension stability, compatibility rules, or a production workflow. The repository should be read as a language implementation with active experimentation, not as a finished compiler platform.

Concurrency and Functional Programming Features

Lux documents several concurrency styles rather than presenting one mandatory model. The list includes threads with atomic references, promises and futures for asynchronous programming, Functional Reactive Programming, Software-Transactional Memory, and the actor model. This gives programmers a set of options for different coordination problems, but the README does not explain which primitives are fully implemented on each backend.

The variety is meaningful for language evaluation. Threads and atomics address shared mutable state at a lower level. Futures and promises address deferred results. STM and actors impose different assumptions about isolation and communication. FRP places event streams and changing values in the center of the abstraction. Selecting among them requires understanding the failure and scheduling model, not just knowing that each name is present in the language documentation.

No concurrency examples, runtime guarantees, scheduler settings, or platform compatibility matrix are included in the README. Consequently, the list supports a feature-scope description but not a claim that all targets provide equivalent concurrency support. A team evaluating Lux should first confirm that the backend it plans to use implements the concurrency model required by its application.

Installing Lux and Starting the First Lux Program

The README does not provide installation commands, a package-manager invocation, a build procedure, or a runnable first program. It directs readers to the book at `documentation/book/the_lux_programming_language/index.md` and to the standard-library documentation at `documentation/library/standard/jvm.md`. The repository also includes `commands.md` and `compilers.md`, but their contents are not shown in the README, so no command or code example can be copied without inventing details.

That absence makes the first-use path unclear for someone evaluating Lux outside its existing development community. The README says the book will remain up to date with the latest stable version, and the standard-library page documents currently available modules. Those are the documented places to verify the compiler invocation, editor setup, and first build procedure. The `lux-mode/` directory is the repository's Emacs plugin, so Emacs users can investigate language support separately from obtaining the compiler.

A practical first-use tutorial cannot be responsibly written from the README alone. In particular, there is no confirmed command for compiling a file, selecting a backend, starting a REPL, or running a generated program. The documented next step is therefore to consult the book and repository command documentation rather than assume a package name or build flag.

License, Release Information, and Maintenance Boundaries

The repository metadata identifies the project as licensed under Apache-2.0, while the README links to Mozilla Public License Version 2.0 and labels it as the project's license. The repository also contains `LICENSE.txt`. This disagreement should be resolved from the authoritative license text and repository policy before code is incorporated into another project. This is a factual licensing discrepancy, not legal advice about which license applies.

The README's current-version section says `0.8.0`, and the repository release information lists `0.8.0` on 2023-09-13, `0.7.0` on 2022-08-15, and `0.9.0` on 2025-11-01. The README also describes Lux as being in the beta stage. The release list and README are not aligned on which version is current, so users should verify the release artifacts and documentation version before relying on the README heading.

The repository is not archived. Its last push was on 2026-10-09, which means the project has recent repository activity according to the repository record. That does not by itself establish production readiness, compatibility across backends, or a predictable release cadence. The beta statement and the version discrepancy remain the more relevant adoption boundaries.

Editorial conclusion

Lux fits developers who want a typed Lisp that can target several runtimes and who are comfortable with a language still identified as beta. It is a poor first choice for teams that require a documented installation path, a settled production status, or consistent platform behavior today. Evaluate the compiler and standard-library documentation for the target runtime first, then inspect the license file because the repository metadata names Apache-2.0 while the README links to MPL 2.0.

Frequently asked questions

What is Lux designed for?

Lux is designed as a functional, statically typed Lisp for programming across the JVM, JavaScript, Python, Ruby, and Lua. It also supports compiling Lux code into libraries for those platforms.

Does Lux support functional programming and macros?

Yes. The language is inspired by Haskell's functional programming and Standard ML's polymorphism. Lux has monadic macros using `(Meta a)` and provides `macro` and `syntax` according to the README.

Is Lux ready for production use?

The README describes Lux as being in the beta stage. It says the JVM compiler is pretty stable, but it does not provide a production-readiness policy or a complete compatibility statement for every backend.

Official sources

  1. Issues
  2. License: Apache-2.0
  3. LuxLang/lux on GitHub
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/luxlang-lux.svg)](https://hysenlabs.com/projects/luxlang-lux)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/luxlang-lux.svg)](https://hysenlabs.com/projects/luxlang-lux)

Was this useful?