Luma Blog

When self Stopped Getting in the Way

Language design is often about noticing friction in places we’ve already accepted as “normal”. You write something the same way a hundred times, and only later realize that the language has been asking you to repeat information it already knows. That’s what happened with self in Luma. For a long time, instance methods required an explicit self parameter. It worked. It was clear. And yet, it always felt slightly off — especially in a language that tries hard to let intent speak louder than ceremony.

Read more →

January 26, 2026

The First Complete Shape of File Handling in Luma

When a piece of a language reaches its first complete shape, it’s rarely because everything imaginable has been added. More often, it’s because the unnecessary parts have been taken away. That’s where file handling in Luma is today. This first wave is not about finishing every possible feature. It’s about reaching a point where the model is coherent, predictable, and aligned with the way the language wants you to think. You can now work with files comfortably, without ceremony, and without constantly being reminded of lower-level mechanics that don’t belong in everyday code.

Read more →

January 23, 2026

When File Handling Finally Felt Right in Luma

Language design often moves quietly. There are no fireworks when something finally clicks - just a moment when you reread a piece of code and realize you no longer feel uneasy about it. That’s exactly what happened recently with file handling in Luma. At first glance, nothing dramatic changed. Files can be read, written, copied, moved. Logs can be appended. Metadata can be queried. All things you’d expect. But internally, one small conceptual shift changed everything.

Read more →

January 21, 2026

Letting Ideas Cook: Rethinking File Handling in Luma

When you’re building something new, progress rarely moves in straight lines. More often, it moves in circles: you sketch an idea, implement it, live with it for a while, and then realize that although it works, it doesn’t quite belong. That’s where we found ourselves with file handling in Luma. Our first design wasn’t wrong. It was logical, explicit, and familiar. It used clear verbs and namespaces, and it looked a lot like what many other languages do. At the time, that felt comforting. Familiar patterns reduce risk, and when you’re still shaping a language, safety matters.

Read more →

January 21, 2026

Imports, Modules, and a Lesson We Had to Learn the Hard Way

Working on a programming language is a strange experience. Some days everything feels obvious: you add a feature, tests pass, and the language grows a little stronger. Other days, you spend hours staring at code that technically works, yet somehow feels wrong - and you can’t immediately explain why. The recent work on modules and imports in Luma was very much the second kind. At the beginning, the goal looked innocent enough. We wanted Luma to support multiple files, to allow code to be split up, reused, and composed in a natural way. Nothing ambitious. Every language does this. Surely this would be a straightforward step forward.

Read more →

December 18, 2025

Luma Begins a New Chapter: Introducing Modules & Imports

Today marks one of the most important steps in Luma’s evolution - we’re officially beginning work on Modules & Imports, a feature that will open the door to larger applications, cleaner code organization, reusable libraries, and a more natural way to structure Luma projects. Until now, Luma has thrived as a simple, expressive language for small scripts, utilities, experiments, and learning. But every growing language eventually reaches a point where code needs to be split across multiple files. That moment has arrived - and we’re excited to share what’s coming next.

Read more →

December 9, 2025

Traits Arrive in Luma - A Big Step Forward

Over the last weeks, Luma has gone through one of its largest language updates so far: a complete traits system with dynamic dispatch, mutating methods, and seamless integration into lists, maps, and function calls. This post is a look behind the scenes - what we built, why we built it, what challenges we ran into, and how this update makes Luma feel more natural and expressive. What Are Traits, and Why Do They Matter? Traits let you describe capabilities independent of concrete types.

Read more →

December 9, 2025

Structs in Luma: What’s Possible Today and What’s Coming Next

Over the last weeks we’ve been expanding Luma with one of the most important building blocks of any modern language: structs. They now integrate cleanly with the compiler, runtime, lists, maps, optional types, and even with the first version of impl blocks (methods + associated functions). Today, we’re happy to share what’s already possible - and what exciting improvements are coming soon. What You Can Do With Structs Today Define rich data types struct Person { name: str age: int } Luma compiles this into a fully-typed Go struct behind the scenes.

Read more →

November 27, 2025

Structs Arrive in Luma - Phase 1 is Here Elegance

Luma continues to evolve, and today we’re excited to introduce one of the most requested language features: structs. This is the foundation for building richer data models, larger programs, and ultimately unlocking higher-level abstractions such as methods, impl blocks, and traits. Structs are now fully supported in Luma as plain data containers, and they already integrate cleanly with the rest of the language: lists, maps, functions, optionals, and composite data structures.

Read more →

November 23, 2025

Introducing Functions in Luma: Expression Power, Clarity, and Higher-Order Elegance

Over the past development cycle, Luma has received one of its most important and powerful upgrades so far: full function support. That includes: Named functions with parameters & return types Expression-bodied functions (=>) Proper return statements Recursive functions First-class function types ((int) -> int) Passing functions as arguments Returning functions from functions Lambdas that adapt to the expected function type Real Go func codegen under the hood With these additions, Luma now supports functional patterns, reusable building blocks, clean abstractions, and all the core mechanisms needed for expressive programming.

Read more →

November 21, 2025

Building Confidence in Luma: Smarter Types, Expressions, and a Playground to Try It Out

Over the last sprint, we’ve made some exciting improvements to Luma — both under the hood and in the ways developers can actually try it. Our focus has been on making the language more expressive, safer, and easier to explore. One of the big wins is around constants and optionals. Constants declared with lock now compile to proper Go constants, which means they behave exactly as intended: immutable values you can rely on. Optionals (?int, ?str) also saw fixes in how they’re assigned and compared to nil, removing awkward pointer issues and making optional handling feel natural.

Read more →

September 5, 2025

Building Confidence in Luma: From Errors to Insight

One of the big goals of Luma has always been to feel like a developer-friendly language: expressive when you write code, predictable when you run it, and helpful when something goes wrong. Over the past weeks, we’ve been putting a lot of effort into that last part — making sure that when Luma programs fail, they fail with clarity. From Go errors to Luma errors Luma compiles down to Go, but raw Go errors were never good enough. They pointed to the generated code, not the Luma file you were working in. Debugging meant reading Go stack traces and mentally mapping them back to your Luma code - frustrating and confusing.

Read more →

August 29, 2025

Strengthening Luma with Logical Foundations

Over the past development sprint, we’ve taken another significant step toward making Luma a practical and reliable language. Our focus was on strengthening the compiler and parser foundations by tackling areas that often cause hidden complexity in language design: logical operators, conditional flow, and type-aware code generation. Logical Operators Arrive Until now, Luma expressions could do math and comparisons, but true logical reasoning (&&, ||, !) wasn’t supported. We carefully extended the lexer, parser, and generator so these operators now work cleanly with the existing precedence system. Importantly, we didn’t hack them in - we aligned their precedence with arithmetic and comparison operators to avoid surprising results. This ensures conditions like:

Read more →

August 24, 2025

Luma Development Update - Building Strength in the Core

This phase of Luma’s development was all about tightening the bolts on the language’s foundation. We didn’t set out to add entirely new features, but to make sure the existing ones behaved exactly as Luma developers would expect in real-world use. What came out of it was a series of refinements that make the language safer, clearer, and more intuitive. One of the biggest improvements was in how type conversions are handled. We revisited the way Luma turns strings into numbers and other types, especially when optional types are involved. Conversions are now much more aware of the developer’s intent, whether they expect a nullable result or a guaranteed value with a fallback. This change eliminates awkward workarounds and makes these conversions feel like a natural part of the language.

Read more →

August 15, 2025

Luma Progress Update: Smarter Compiler, Type-Safe Lists, and a Vision for Extensibility

Today marks a major milestone in the evolution of Luma, our lightweight, expressive, and type-safe scripting language. Our focus was squarely on list operations and compiler robustness. Here’s what we accomplished: Type-Safe List Operations We implemented strongly-typed list functions across all core types: add, add_all, remove, remove_at, remove_all, sort All supported for: int, float, str, bool, byte This brings full parity between the Luma syntax: nums: [int] = [1, 2, 3] nums.add(4) nums.remove(2) nums.sort() …and the generated Go code:

Read more →

July 22, 2025

Rebuilding the Parser: Why We Changed and What It Enables

Over the past few weeks, we’ve been evolving the Luma parser to support richer language features like: Chained method calls and expressions Lambda expressions with inline or block bodies Interpolated strings Complex expression precedence handling Dot access + indexing + slicing Functional constructs like .filter(x -> x > 1), .walk(...) -> {} But as we began introducing these features, we hit a wall: our old parser was brittle - adding one new construct often broke several others.

Read more →

July 17, 2025

Breaking the Lambda Curse: Refactoring Our Compiler the Right Way

For weeks, our compiler worked - until it didn’t. Specifically, it choked on one of the most deceptively simple constructs in any modern language: lambda expressions. The syntax x -> x > 1 became our white whale. Sure, we could patch it. But patches turned brittle. One new feature would fix a case, and another would break it. It was time. We stepped back and refactored - from the ground up.

Read more →

July 16, 2025

Back to the Drawing Board: Strengthening the Foundations of Luma

Sometimes the best way forward is a few steps back - especially when building something as intricate and expressive as a programming language. Over the past weeks, we’ve been shaping Luma, our small, readable, and expressive scripting language. Progress has been exciting: we’ve supported basic types, function calls, collections, and even interpolated strings. But then came lambdas - and everything began to wobble. Lambdas Exposed a Cracked Foundation Implementing lambda expressions (x -> x + 1) seemed straightforward at first, but as we integrated them deeper into our parser, problems started surfacing. Adding lambdas triggered a cascade of subtle bugs. Functionality we thought was solid - like parsing chained method calls or indexing expressions - began to break.

Read more →

July 15, 2025

Installing Luma - What’s Coming Soon

Luma is shaping up fast, and as the language grows, we want to make it as accessible and smooth to adopt as possible - whether you’re a Go developer, a newcomer, or a scripting enthusiast. That’s why we’re planning a dual-mode installation system that fits different user needs. Two Ways to Install Luma We want Luma to just work. So instead of one rigid setup path, you’ll be able to choose:

Read more →

July 13, 2025

File API: First Edition - Simple, Powerful, Luma-style

We’re excited to announce the first official File API in Luma! It brings clean, readable, and expressive file handling - in a way that matches Luma’s philosophy of clarity, safety, and zero boilerplate. Highlights Safe Resource Handling with use use handle = file.open("data.txt", "r") { print(handle.text()) } Auto-closes the file after the block Cleaner and safer than manual close() Intuitive Reading & Writing text: str = "" use handle = file.open("notes.txt") { text = handle.text() } use handle = file.open("log.txt", "a") { handle.append("Line 1").append("Line 2") } Text and bytes both supported Chaining with .append() is natural and expressive File Info Made Easy ext = file.ext("photo.jpg") // "jpg" size = handle.size() // in bytes .ext() returns just the extension, no dot (user-friendly) .size() reports file size (no extra logic needed) Memory Mapping Support use mmap = file.mmap("big.bin", "r") { print(mmap[0..100]) } Efficient access for large files Read and write support File Path Tools path = file.join("dir", "data.txt") // cross-platform base = file.basename("/tmp/a.txt") // "a.txt" Future Ready We’ve designed the File API with these goals in mind:

Read more →

July 13, 2025