Est. 2009 Beginner

Agena

A procedural scripting language built on the Lua C sources, wearing ALGOL 68 syntax with borrowings from Maple and SQL - written by one person since 2006 and still shipping releases every few days on Windows, Linux, macOS, Solaris, DOS, OS/2 and the Raspberry Pi.

Created by Alexander Walz

Paradigm Multi-paradigm: Procedural and imperative, with first-class functions, closures and metatable-based object orientation
Typing Dynamic and mostly weak, with optional runtime type assertions on procedure parameters, locals and return values
First Appeared 2009
Latest Version Agena 7.7.10 Ariel (23 July 2026)

Agena is a procedural scripting language implemented as an interpreter on top of the ANSI C source code of Lua, but wearing a completely different face: where Lua is deliberately minimal, Agena presents an ALGOL 68-flavoured surface syntax with if ... then ... fi, do ... od and esac, borrowings from the Maple computer algebra system, a handful of SQL-inspired constructs, and a standard library stuffed with real and complex arithmetic, statistics, calculus, linear algebra, arbitrary-precision numbers, interval arithmetic, fractals, curses terminal UIs, SQLite bindings and an xBase reader. It has been written and maintained by one person, Alexander Walz, for roughly twenty years, and at the time of writing it ships new releases every few days.

The name comes from Beta Centauri - Agena, one of the brightest stars in the night sky - and from the Agena, the unmanned target vehicle NASA docked with during the Gemini programme in the 1960s.

History and Origins

Agena’s origin is recorded in unusual detail in its own primer, and it is a practical rather than a theoretical one. According to that account, Walz took up Lua in 2005 to write procedures for phonetic analysis, and ANSI C in order to move those procedures into a compiled package. What began as a user of Lua turned into a modifier of it: the first changes to the Lua parser were made in autumn 2006, with extensive rework of the lexer, parser and virtual machine following in the summer of 2007. Most of the intended functionality was complete by March 2008, and the first data structure with no Lua counterpart - Cantor sets - arrived a month later.

The first public release went up on SourceForge in January 2009; the SourceForge project itself was registered on 21 January 2009. Walz introduced the language to the wider world on 26 March 2009, in a message to the Lua mailing list:

In summary, Agena is an easy-to-learn interpreted language suited for sophisticated procedural programming and your everyday needs. Its syntax looks like a very simplified Algol 68 with elements taken from Lua and SQL.

That announcement already listed binaries for Solaris, Linux, Windows, OS/2 and eComStation, and Novell DOS 7 - the pattern of unusually broad, unusually retro platform coverage that has held ever since.

A note on dating. Agena is frequently listed with a first-appearance year of 2006, which is the year work on the Lua fork began rather than the year anything was released. The first release the public could obtain was in January 2009, and that is the date used in this entry.

Design Philosophy

Agena is not a Lua dialect in the sense that Luau or Terra are. It reuses Lua’s C implementation as an engine and then diverges on almost every visible decision.

Readability over minimalism. Lua’s design ethos is to keep the language small enough to hold in your head and let libraries do the rest. Agena goes the other way: closing keywords instead of end everywhere, a case ... of ... esac statement, try/catch/yrt exception handling, extended loop constructors, compound assignment operators for arithmetic, bitwise and shift operations, and a very large built-in library. The stated audience is scientific, educational and everyday scripting use, and the language is pitched as easy to learn rather than easy to implement.

Batteries in the kernel, not in packages. Many of Agena’s data structures are built into the interpreter core rather than layered on top, which is the justification the project gives for having so many of them. The project’s own documentation states that Cantor sets consume roughly 40% less memory than ordinary tables, and has described sequences as faster than tables for appending values. These are the author’s own figures; the documentation does not publish the benchmark programs, input sizes or hardware behind them, and no independent benchmarks of Agena against comparable interpreters appear to exist. Treat them as design intent rather than measured results you can reproduce.

Mathematics as a first-class concern. Complex arithmetic is in the language, not a library - x!y constructs a complex number and exp(1+2*I) just works. Arbitrary-precision arithmetic is provided through a bundled MAPM-based package, alongside statistics, calculus, combinatorics, linear algebra and interval arithmetic. The influence of Maple is visible in both the notation and the choice of what belongs in the box.

Optional type assertions in a dynamic language. Procedure parameters, locals and return values can carry :: type assertions (and -: for “not of this type”), checked at runtime. It is closer to a contract than to a type system, but it lets library code fail early and legibly.

Key Features

Procedures use the ALGOL-descended proc ... is ... end shape, with type assertions and recursion:

factorial := proc(n :: number) :: number is
   if n < 0 then return fail
   elif n = 0 then return 1
   else return factorial(n-1) * n
   fi
end;

The Mandelbrot membership test from the project’s own sample-code page shows complex arithmetic, a combined for/while loop, and the ! complex constructor together:

mandelbrot := proc(x :: number, y :: number, iter) :: number is
   local c, z;
   if unassigned(iter) then
      iter := 128
   fi;
   z := x!y;
   c := z;
   for i from 0 to iter while abs(z) < 2 do
      z := z^2 + c
   od;
   return i
end;

Data structures go well beyond Lua’s single table type:

StructurePurpose
TableLua-style associative array; also used for arrays and dictionaries
SetCantor set of unique items, {'donald', 'mickey', 'donald'} collapsing to two elements
SequenceStrictly sequential integer-indexed collection, seq(1, 1, 'donald', true)
RegisterFixed-size vector with a top pointer, usable as a stack
PairTwo-value container, 10:11, with left and right accessors
Vector / matrixAngle-bracket notation added in 4.0.0: < 10, 20, 30 > and < <1,2,3>, <4,5,6> >
OthersMultisets, singly-, unrolled singly- and doubly-linked lists, heaps, bidirectional maps, dual numbers, hash maps, numeric arrays

Strings are sliceable by range - str[3 to 6] - and the string library is large enough to be the reason some users are there at all.

Control flow includes if/elif/fi, case ... of ... esac, numeric for, for ... in, while, do ... until, and try ... catch in err then ... yrt. Procedures support full lexical scoping, lambda-style short-cut functions, and remember tables for automatic memoization of recursive calls.

The 6.x and 7.x series added a number of conveniences that give a sense of the language’s direction: chained relational operators (1 < x < 3), compound bitwise and shift assignment (&&:=, <<:=), a with clause for binding intermediate locals inside an expression, begin/end scopes, and Perl-style autovivifying tables via tables.auto().

Evolution

SeriesApproximate periodCharacter
1.x2009 - 2013Core language established; broadest platform list, including Haiku; AgenaEdit shipped alongside the interpreter
2.xDec 2013 - Mar 2023The long plateau - roughly nine years and dozens of point releases, reaching 2.37.6; Raspberry Pi support, the SourceForge forum, steady library growth
3.xJul 2023 - Aug 2024Cadence changes completely; releases begin arriving weekly or faster, with AgenaEdit reinstated in September 2023
4.xAug 2024 - Jun 2025Maple-style vector and matrix notation; deprecated aliases removed
5.xJun 2025 - Sep 2025Interval arithmetic, metamethods for left/right, naming cleanups
6.xSep 2025 - Feb 2026Deliberate breaking syntax changes: short-cut function tokens, shift operators, -: and -?
7.xFeb 2026 -Multi-assignment with clauses, begin/end scopes, autovivifying tables, output-precision control, hash-map performance and safety work

The most striking thing in that table is the discontinuity around mid-2023. The bundled change log covers 3.1.0 (12 July 2023) through 7.7.10 (23 July 2026) and contains approximately 336 dated releases in that span - well over a hundred a year, against a 2.x series that took nearly a decade to work through its point numbers. Whatever changed in the author’s circumstances in 2023, the project has been in a sustained sprint since.

Recent work has leaned toward correctness and memory safety rather than language surface. Releases are routinely described as Valgrind-tested on x64 Linux and Dr. Memory-tested on Windows, and the 7.7.x entries document fixes for out-of-memory handling across dozens of functions and a latent use-after-free in the hash-map garbage-collection metamethods.

Where the change log does make a performance claim, it tends to be better contextualised than most: release 7.7.10 replaced the DJB2/BKDR polynomial hash in the bundled khash library with CRC32 in the strmap, strhash and uintmap packages, reporting collisions falling from 0.05599% to 0.00637% - an 89% reduction - at a stated 10% speed penalty, measured against a reference set of 517,996 surnames. Release 7.7.8 reports that strings.ljustify and strings.rjustify became 63% faster after being rewritten in C, though without stating the input or the measurement method.

Platform Support

The project’s own download page for release 7.7.10 lists installers for:

  • Windows (32-bit setup, plus portable EXE and ZIP), including AgenaEdit
  • OS/2, eComStation and ArcaOS (WarpIN package)
  • Linux (DEB for x86 and x64, RPM for x86), including AgenaEdit
  • Mac OS X (PKG, Intel), including AgenaEdit
  • Solaris 10 / OpenIndiana (x86 package), including AgenaEdit
  • DOS (ZIP)
  • Raspberry Pi (ARMv6 32-bit and ARMv8 64-bit)

Source is published as a tarball, along with a separate test suite. Haiku appeared in the platform list around 2010 to 2015 and no longer does. Because the platform set has moved over time - Raspberry Pi and Solaris builds were reportedly withdrawn in 2024 and later restored - check the download page for the specific release you intend to use rather than relying on any historical list, this one included.

Licensing

Per the project’s own legal page, the Agena source files are distributed under the MIT licence, while the binary distributions are under the GNU Library General Public License, version 2 or later - the latter reflecting the GPL/LGPL-licensed libraries the binaries link against. The SourceForge project lists both GPLv2 and MIT accordingly.

Current Relevance

Agena occupies an odd position: by release activity it is one of the most actively developed languages you have never heard of, and by adoption it is essentially invisible.

The activity is not in doubt. Version 7.7.10 shipped on 23 July 2026, three days before this entry was written, and the change log records hundreds of releases over the preceding three years. Documentation is thorough and versioned in lockstep with the interpreter - a primer, a reference, a crash course and a spreadsheet quick reference, all reissued at 7.7.10.

The adoption is equally clear. SourceForge reported on the order of a hundred downloads a week across all binaries at the time of writing. There is no package registry, no conference, no framework ecosystem, no distribution packaging of consequence, and the single public discussion channel is a SourceForge forum opened in 2015. The largest visible body of third-party code is roughly 149 Rosetta Code pages. The project itself reportedly withdrew some platform builds in 2024 “due to lack of public interest.”

Encyclopedic listings that mark Agena dormant are reading the adoption signal, and it is a fair signal to read - but it is wrong about the software. This is a maintained, tested, documented, currently released language.

Why It Matters

Agena is a useful specimen for two reasons.

The first is what it shows about forking an implementation rather than a language. Lua’s C sources have spawned a number of derivatives, most of which stay recognisably Lua-shaped. Agena took the engine and rebuilt the surface into something an ALGOL 68 or Maple user would recognise, then grew a standard library an order of magnitude larger than Lua’s. It is a demonstration that “based on Lua” can mean the runtime and nothing else - and that a single maintainer can carry that much divergence for two decades.

The second is what it shows about the gap between maintenance and adoption. Agena does almost everything the conventional advice says to do: it is documented, cross-platform, permissively licensed at the source level, easy to install, easy to learn, and shipped relentlessly. It still has no user community. Its closest analogue in this encyclopedia is AFNIX - another decades-long single-author project with thorough documentation and no users - and the pair together make the point more sharply than either does alone. Languages are not adopted for being good. They are adopted for arriving attached to a problem someone urgently needs solved, and neither of these ever did.

For anyone with an OS/2 machine, a DOS box, a Solaris 10 install or a first-generation Raspberry Pi, though, Agena remains one of the very few modern, actively maintained scripting languages that will still install and run - and that is not a small thing.

Timeline

2005
According to the language primer, Alexander Walz learns Lua in order to write procedures for phonetic analysis, and ANSI C in order to move them into a C package - the work that becomes the starting point for Agena
2006
In autumn, the first modifications to the Lua parser begin; the primer describes extensive rework of the lexer, parser and Lua virtual machine following in the summer of 2007, with most of the intended functionality complete by March 2008 and Cantor sets - the first genuinely new data structure - arriving a month later
2009
The first public release appears on SourceForge in January; the project was registered there on 21 January 2009. Walz announces the language to the Lua mailing list on 26 March 2009, describing binaries for Solaris, Linux, Windows, OS/2 and eComStation, and Novell DOS 7
2010
The project website advertises installers for Mac OS X, Windows, Linux, OS/2 and eComStation, Solaris, Haiku and DOS - the widest platform spread the language would claim; contemporary listings put the 1.x series at around release 1.1.0
2013
The project announces during the autumn that Agena runs on the Raspberry Pi, and releases Agena 2.0 in December, opening the second major series
2015
The Agena discussion forum opens on SourceForge, reportedly in April, giving the project its only real public discussion channel
2023
The long 2.x series closes out - reportedly with 2.37.6 in March - and the 3.x line begins, with 3.1.0 Conroe dated 12 July. AgenaEdit, the bundled syntax-highlighting editor, returns in September after a period of absence
2024
Release 4.0.0 Chattanooga on 24 August adds Maple-style angle-bracket notation for vectors and matrices; the release cadence accelerates sharply, with well over a hundred point releases shipped during the year
2025
Two major series ship in a single year: 5.0.0 Incline on 17 June, which adds an interval-arithmetic package adapted from Lua, and 6.0.0 Huntsville on 27 September, which makes deliberate breaking changes to the syntax - short-cut functions move from angle brackets to the colon-bracket forms, the bitwise shift operators are renumbered, and the not-of-type operator changes from :- to -:
2026
Release 7.0.0 Vega on 24 February extends the with clause to multiple sequential assignments, replaces the scope/epocs block keywords with begin/end, and adds Perl-style autovivifying tables. Release 7.7.10 Ariel follows on 23 July

Notable Uses & Legacy

Rosetta Code

Agena is one of the languages carried on Rosetta Code, with approximately 149 pages in its category as of this writing - solutions to the site's programming tasks written in Agena. It is by a wide margin the largest publicly visible body of third-party Agena code, and the main way a curious programmer is likely to encounter the language in the wild.

OS/2, eComStation and ArcaOS

Agena has been built for OS/2 and its commercial successors since the earliest releases and is distributed as a WarpIN package alongside the Windows and Linux builds. It is catalogued on the eCSoft/2 software index, and the project has also published separate OS/2 and DOS builds of Lua itself. For a platform whose active software is largely maintained by hobbyists, a scientific scripting language that still ships same-day builds is unusual.

Raspberry Pi

The project announced Raspberry Pi support in 2013 and publishes both ARMv6 32-bit and ARMv8 64-bit builds for the current release - ARMv6 32-bit and ARMv8 64-bit DEB packages are listed on the download page. Walz posted the language to the Raspberry Pi forums on 24 July 2024. Pi builds were reportedly withdrawn from the SourceForge download area in 2024 for lack of public interest, and later restored.

DOS retrocomputing

A DJGPP-based DOS build has been part of the distribution since the 2009 announcement, which named Novell DOS 7 as a target, and a DOS ZIP archive is still published for the current release. Very few actively developed languages of any kind still ship a same-version DOS binary.

Phonetic and linguistic analysis

The language's own origin story is a working use case: per the primer, Walz took up Lua and then C to write phonetic-analysis procedures, and the early project website described Agena as intended for scientific, educational and linguistic applications. The distribution retains string-processing facilities pointed in that direction, including a Shannon-entropy function and Latin transliteration.

Language Influence

Influenced By

Running Today

Run examples using the official Docker image:

docker pull
Last updated: