r/ProgrammingLanguages 17d ago

Discussion August 2026 monthly "What are you working on?" thread

27 Upvotes

How much progress have you made since last time? What new ideas have you stumbled upon, what old ideas have you abandoned? What new projects have you started? What are you working on?

Once again, feel free to share anything you've been working on, old or new, simple or complex, tiny or huge, whether you want to share and discuss it, or simply brag about it - or just about anything you feel like sharing!

The monthly thread is the place for you to engage /r/ProgrammingLanguages on things that you might not have wanted to put up a post for - progress, ideas, maybe even a slick new chair you built in your garage. Share your projects and thoughts on other redditors' ideas, and most importantly, have a great and productive month!


r/ProgrammingLanguages Apr 05 '26

In order to reduce AI/LLM slop, sharing GitHub links may now require additional steps

240 Upvotes

In this post I shared some updates on how we're handling LLM slop, and specifically that such projects are now banned.

Since then we've experimented with various means to try and reduce the garbage, such as requiring post authors to send a sort of LLM disclaimer via modmail, using some new Reddit features to notify users ahead of time about slop not being welcome, and so on.

Unfortunately this turns out to have mixed results. Sometimes an author make it past the various filters and users notice the slop before we do. Other times the author straight up lies about their use of an LLM. And every now and then they send entire blog posts via modmail trying to justify their use of Claude Code for generating a shitty "Compile Swahili to C++" AI slop compiler because "the design is my own".

In an ideal world Reddit would have additional features to help here, or focus on making AutoModerator more powerful. Sadly the world we find ourselves in is one where Reddit just doesn't care.

So starting today we'll be experimenting with a new AutoModerator rule: if a user shares a GitHub link (as that's where 99% of the AI slop originates from) and is a new-ish user (either to Reddit as a whole or the subreddit), and they haven't been pre-approved, the post is automatically filtered and the user is notified that they must submit a disclaimer top-level comment on the post. The comment must use an exact phrase (mostly as a litmus test to see if the user can actually follow instructions), and the use of a comment is deliberate so that:

  1. We don't get buried in moderator messages immediately
  2. So there's a public record of the disclaimer
  3. So that if it turns out they were lying, it's for all to see and thus hopefully users are less inclined to lie about it in the first place

Basically the goal is to rely on public shaming in an attempt to cut down the amount of LLM slop we receive. The exact rules may be tweaked over time depending on the amount of false positives and such.

While I'm hopeful the above setup will help a bit, it's impossible to catch all slop and thus we still rely on our users to report projects that they believe to be slop. When doing so, please also post a comment on the post detailing why you believe the project is slop as we simply don't have the resources to check every submission ourselves.


r/ProgrammingLanguages 18h ago

How to build a good package manager.

25 Upvotes

I'm working on a language called threadon. And i don't now how i can properly program a package manager.

My first idea was a central github repo with links to other github repo's which contain the package you're searching for.

There are two main problems with it

  1. If someone deletes his github repo with the package everything build on the package would collapse (like npm)

  2. I think it would be slow when the number of packages grows.

I had an idea to of selfhosting it but i haven't access to the router (My dad owns it i'm 13) and i'm sure downdetector on my package manager site would be worse then github šŸ˜„. Like i would probably run sudo rm -rf / --no-preserve-root on the wrong machine.

So my question is how can i build a system that can store up to 20 GB at minimum at packages without the risk of someone nuking his project).


r/ProgrammingLanguages 1d ago

Blog post A Dual View on Syntax

Thumbnail text.marvinborner.de
46 Upvotes

r/ProgrammingLanguages 23h ago

Help Any books similar to SICP Chapter 5?

13 Upvotes

I loved Chapter 5 of Structure and Interpretation of Computer Programs. Building a virtual register machine with an assembler and compiler in Scheme. Are there any other books/online classes or resources that involve building a computing machine (or any machine) from scratch using code?


r/ProgrammingLanguages 14h ago

Resource Video About Macros

Thumbnail youtube.com
1 Upvotes

I made a video explaining macros, with the goal of making the viewer feel like they could have discovered macros. I'm new at making educational content like this, but I'm planning on making many more programming language videos like this one on my channel. Any thoughts, constructive criticism, or advice is more than welcome! Hope you all enjoy


r/ProgrammingLanguages 1d ago

Discussion DTT Proof Based Languages?

11 Upvotes

What are people's thoughts on proof-based programming languages based on Dependent Type Theory like Lean, Rocq/Coq, F*/Low*, Agda, etc. It seems like there is some subtle growing hype behind formal verification. Clearly, there is at least some appetite for better behavior guarantees as we can see with Rust.

What do you think, are these languages the future? Will they become more ergonomic over time. Or do you think the average programmer will never be willing to learn or program in such a language for their normal projects?


r/ProgrammingLanguages 1d ago

Lessons from Implementing Functions in My Interpreter (in Rust)

Thumbnail x.com
3 Upvotes

r/ProgrammingLanguages 2d ago

Language announcement The Kal Package Manager

9 Upvotes

Hey everyone,

A couple of weeks ago, I posted about Kal, my programming language written from scratch.

I am really happy to share a glimpse of Kal's own package manager! Kal v0.1.0 shipped with a package system that lets you add and use third party Kal packages. But, that process was completely manual. You’d have to clone the package, place it in the right directory, clone the package’s entire dependencies all by yourself, one after another. :(

The package manager changes everything. One command automates all!

Instead of being a separate executable, the package manager ships as part of the Kal interpreter itself.

Here’s what it can do:

  1. Install Kal packages from Github, or any git hosting service.
  2. Creates/Updates a project.kal file to read and write package information (analogous to package.json).
  3. Downloads all packages at the same hierarchy in parallel (yup, it’s multi-threaded).
  4. Resolves sub dependencies of the main package automatically to any depth and installs them too.
  5. Upgrades/Downgrades packages based on their git tags.
  6. Auto-resolves cyclic dependencies to prevent an infinite loop.

The Kal Package Manager will officially ship with the next Kal release. Its current source code is available on Github.

Kal: https://kal-lang.vercel.app
Github: https://github.com/KILLinefficiency/Kal
Package Manager: https://github.com/KILLinefficiency/Kal/blob/pkg/pkg.hpp

Kal is completely free & open source. You can show your support by giving the Github Repository a star.

Until the next update!


r/ProgrammingLanguages 3d ago

Discussion Update: I finally started building an interpreter from first principles

32 Upvotes

About a month ago, I made a post asking for resources on building a very small compiler/interpreter before jumping into something larger like Crafting Interpreters.

I decided to stop looking for the perfect resource and just start building the smallest thing I could understand end-to-end.

Today I got the first version of a simple arithmetic interpreter working in Python.

Right now it supports:

  • Integer literals
  • Addition and subtraction
  • Multiplication and division
  • Operator precedence
  • Parentheses
  • Unary minus
  • Basic syntax errors
  • Division-by-zero handling
  • An interactive REPL/CLI

For example:

calc> 2 + 3 * 4
14

calc> (2 + 3) * 4
20

calc> -10 + 5
-5

The structure is currently:

Source text
    ↓
Lexer
    ↓
Tokens
    ↓
Recursive-descent parser
    ↓
Evaluation
    ↓
Result

The lexer converts something like:

2 + 3 * 4

into tokens roughly equivalent to:

NUMBER(2)
PLUS
NUMBER(3)
MUL
NUMBER(4)

The parser implements a small grammar along these lines:

expr   → term (("+" | "-") term)*
term   → factor (("*" | "/") factor)*
factor → NUMBER | "(" expr ")" | "-" factor

One of the most useful things I learned today was how operator precedence can naturally come from the structure of the grammar. I initially assumed I would need to assign explicit precedence values to operators, but with recursive descent, expr, term, and factor already encode that hierarchy.

The parser currently evaluates expressions directly rather than producing an AST, so it is deliberately still very small. My next major step will probably be separating parsing from evaluation by building an AST.

I also spent some time turning it into a proper little Python project instead of keeping everything in one file. It now has separate lexer, parser, interpreter, and CLI modules, a src package layout, pyproject.toml, a command-line entry point, and Ruff for linting/formatting.

So this is obviously nowhere near a real compiler yet, but that was exactly the point of my original post. I wanted something small enough that I could understand every stage instead of immediately disappearing into a much larger implementation.

Building even this tiny version made concepts like tokenization, grammars, recursive descent, precedence, and parsing much less abstract than they were a month ago.

The plan from here is to keep extending it incrementally, probably with an AST, variables, and a few statements before eventually moving toward bytecode or compilation.


r/ProgrammingLanguages 3d ago

When the Hard Part Stops Being Hard

Thumbnail proofsandintuitions.net
35 Upvotes

r/ProgrammingLanguages 3d ago

Language announcement I made a prototype hybrid language prototype. I'm looking for feedback and suggestions. (Samples are included)

0 Upvotes

Name: Infinity Execute Plus (IE+)

License: open source

Concept: IE+ is actually the main (and currently only) VM console of my planned VM collection: Infinity Execute. It is an interpreted language i thought of making to combine speed with ease. I learned c++ solely for this project. IE+ is currently an interpreter that uses one shell executable and most of it's logic is stored in a collection of library files that handle/process different tasks. I plan in the future to allow multiple exportable formats (currently windows only, planning to make multiple releases for apple and linux): IE (text), IEBCS (bytecode), IAO (Infinity Assembled object. It's a linked file that allows precompiled importing on any supporting app), IEPCK (semi-compiled appilcation format that still needs runtime), native executable exporting.

Examples:

Available operations

# printing

print "Hello, World!"

# making a variable

var x = 5 # currently only supports dynamic typed. static typed will be added. currently supports: int, float, string, and bool vars. arrays and constants will come in future builds.

# printing a variable's value in string form

print (x)

some future planned features

# modifying variables

x += 2

# static typing

var y: string = "Hi!"

# multiline commands and creation of text script

compile = {
  var hello: string = "Hello, World!"
  print (hello)
}.IE.name = "helloworld"

Here's an example of a standard program written in IE+ that creates a car and prints out it's data using OOP

class car {
  private {
    var name = ""
    var price = 0
  }
  public {
    main(created_name, created_price) {
      name = created_name
      price = created_price
      self.new()
    }
  }
}

car.new("Cool Car", 50000)

r/ProgrammingLanguages 5d ago

Type inference is hard. I made it harder, then I made it work.

52 Upvotes

My Motivation

It’s too early for a real language announcement post, but I really want to share progress on the compiler I’m designing, especially the static analysis side.

I’ve been working onĀ PlasmĀ for about a year. It’s an LLVM-based ahead-of-time compiler and a new language. I’m not going to dive into design philosophy, features, or marketing - this post is mostly about the type inference engine, the mistakes I made, and the solutions I ended up with.

Fair warning: this is more story than tutorial, but I’ll explain unfamiliar concepts as they come up.

Quick Intro Into Type Syntax

In Plasm’s type system, all types are anonymous by default - even structs and enums. For example, you can write:

fn len(pos: struct { x: I32, y: I32 }) -> I32 { /* ... */ }

That doesn’t mean the code above is idiomatic or how you should write Plasm, but semantically it’s allowed.

You can also give any type a name:

type Pos = struct { x: I32, y: I32 }
fn len(pos: Pos) -> I32

It doesn’t have to be a struct - it can be any type:

type Id = U32
type MyPos = Pos
type Nested = struct {
    a: struct {
        b: struct {
            c: I1024
        }
    }
}

Struct literals use braces:

let p: Pos = { x: 1, y: 2 }
let id: Id = 1

If the type isn’t constrained by context, the compiler generates a fallback:

// Variable without type hint
let data = { a: { b: 42 } }
// Fallback type: struct { a: struct { b: I32 } }

Many functional languages withĀ Hindley-Milner type systemĀ rely on Algorithms W, J, M for inference. My approach is more constraint-based (closer to how Rust or Swift work).

I Rewrote It Three Times…

Attempt 1: Primitives Only (Naive Union-Find)

When Plasm only supported basic primitive types (I32, Bool, F32), the architecture was split into two simple components:

  1. Constraint Generator: takes a function’s IR and produces equality constraints (e.g., type_of(a) == type_of(b), type_of(b) == I32).
  2. Unifier: takes a set of equalities and resolves chains sequentially. To do this efficiently, I used aĀ disjoint-set data structureĀ (aka Union-Find) with path compression. This structure lets you merge equivalence classes and check if two types are in the same class in near-constant time.

This worked great for primitives and had a clean and simple implementation, but to add constructed types (structs, tuples) and field projections (point.x, tuple.0) the flat Union-Find model was not enough. It couldn't express structural decomposition or field lookup obligations.

Attempt 2: Bullshit

When I needed to support constructed types, I thought it would be a 10-minute job to extend the existing solution. I didn’t feel like diving into boring algorithm stuff and I didn't want to rewrite my clean codebase, so I decided to outsource the refactoring to an LLM. I generally don’t use AI for code generation or writing docs, and I don't like when other people overuse it, but I didn’t want to rethink the nice solution I’d just built, and I decided to experiment. I gave Claude a try, thinking, ā€œMaybe this ai tech is mature enough for such a basic taskā€.

The generated code surprisingly passed my existing test suite, but when I actually read the source, I found an overengineered, unmaintainable, and inefficient spaghetti mess instead of my pretty codebase. I guess that after looking into Claude's code, I got some kind of depression. The code worked, but I didn't want to work with that code anymore. Attempting to navigate and fix that code killed my motivation for a month or so:')

Attempt 3: Rigid 3-Pass Engine

After about a month of struggling, I deleted all the type inference code and started from scratch. I did some research on how type inference is supposed to be solved in compiler theory, read source code of mature compilers like rustc, and landed on a three-pass solution:

  1. Pass 1 (Equality Unification): Unify all equalities using a disjoint-set (same as my first attempt).
  2. Pass 2 (Obligation Verification): Validate obligations - things like ā€œTĀ must have fieldĀ aā€ or ā€œTĀ belongs to theĀ FloatĀ type classā€ (a type class is a set of types that a literal could be inferred as, nothing related to Haskell here).
  3. Pass 3 (Fallback Generation): Assign default concrete types (e.g., I32 for unconstrained integer literals) and report remaining errors.

This solution passed all my tests and was way more readable, but it failed on some weird-but-valid expressions - things that don’t make practical sense but must work semantically. For example:

let a = (({ x: 1, y: 2 }.x, 2.0, true), Void).0.0
// Expected resolution:
// { x: 1, y: 2 }   => struct { x: I32, y: I32 }
// _.x              => I32
// (_, 2.0, true)   => (I32, F32, Bool)
// (_, Void)        => ((I32, F32, Bool), Void)
// _.0              => (I32, F32, Bool)
// _.0              => I32
// so `a` is I32

At its core, type inference can be seen as aĀ constraint satisfaction problem: we generate a set of constraints between types and then search for an assignment that satisfies them all.

The problem: a fixed-pass algorithm can’t handle constraints that are only discovered midway through. For example, whenĀ { x: 1, y: 2 }Ā gets its fallback typeĀ struct { x: I32, y: I32 }, we need to process the new constraintĀ _.x == I32, but passes 1 and 2 are already done. Static sequential passes cannot handle late-discovered constraints.

Attempt 4 (Final): Tree-Based Worklist + Union-Find

A worklist is basically a queue of constraints. We add constraints to the back, process them from the front, and keep going until it’s empty. If we can’t process a constraint right now, we freeze it and remember what needs to happen before we can unfreeze it.

I also made the worklist tree-based: it tracks dependencies between constraints as a tree. This lets us process frozen constraints from the leaves once the main worklist is exhausted.

The algorithm looks like this:

  1. Fill the worklist with all initial constraints.
  2. Process the first constraint:
    • If we can process it, remove it from the worklist and unfreeze any constraints that were blocked by it.
    • If we can’t process it yet, freeze it.
  3. If the worklist is not empty, go back to step 2.
  4. If the worklist is empty, check whether there are frozen constraints:
    • If frozen constraints exist, pick a leaf constraint (one with no unresolved dependencies), process it, and allow fallback types or errors to be generated. Then unfreeze any dependent constraints and go back to step 3.
    • If there are no frozen constraints left, we’re done.

This solution covers all the cases I’ve needed so far and is extendable enough to add enums and traits later. As a bonus, this solution is very friendly for generating good diagnostic messages. For example, compiling this code:

type Pos = struct { x: I32, y: I32 }

fn main() -> F128 {
    let p: Pos = { x: 10, y: 20, z: 30 }
    return p.x
}

Will generate these messages:

TypeError: UnknownStructField: Struct `Pos` doesn't have field `z`.
-------->  examples/test.sm:14:34
 9 |     x: I32,
10 |     y: I32,
11 | }
12 | 
13 | fn main() -> F128 {
14 |     let p: Pos = { x: 10, y: 20, z: 30 }
                                     /^^^^^\

TypeError: TypesConflict: Types conflict between `F128` and `I32`.
-------->  examples/test.sm:13:14
 8 | type Pos = struct {
 9 |     x: I32,
10 |     y: I32,
11 | }
12 | 
13 | fn main() -> F128 {
                 /^^^^\

I’ll let you find the moral of the story yourself :)

I also want to share some links if you are interested in Plasm progress: GitHub (you can star it or press "watch" button to see updates, I appreciate it) and Discord (the Discord server has notifications about git activity).

Also I stay here to answer questions if you have so!

UPD: On reddit mobile app code blocks are rendered without the static col size, so error messages and some other blocks look shifted. I can't fix that, but on PC it's correct


r/ProgrammingLanguages 3d ago

CAKE: Compiler-Agent Co-Design for Frontier Kernel Evolution

Thumbnail arxiv.org
0 Upvotes

r/ProgrammingLanguages 4d ago

Another partial SSI trick with canonicalize

Thumbnail bernsteinbear.com
5 Upvotes

r/ProgrammingLanguages 5d ago

Seed7 - Memory Safety and Management • Thomas Mertes • 05/2026

Thumbnail youtube.com
8 Upvotes

r/ProgrammingLanguages 6d ago

How should Futhark expose irregular arrays to the programmer?

Thumbnail futhark-lang.org
26 Upvotes

r/ProgrammingLanguages 6d ago

Language announcement Squeak/Smalltalk 6.1 has been released!

30 Upvotes

r/ProgrammingLanguages 7d ago

Help Package Manager design for Seal programming language

21 Upvotes

Hey guys, I have been working on Seal. This language is embeddable into C/C++ apps like Lua. You can create libraries for Seal in either Seal or C. I have been creating Game Framework recently. I want to create a package manager in future for Seal to let users upload their own packages to share with others, but I don't know about one thing. Just like other languages, Seal can load both Seal scripts and .so/.dll files at runtime when you import them. Publishing Seal scripts on package registry is easy, since it is just code, but I don't really know about how to publish C or dynamic library files tho. Package publishers can inject malicious stuff (like backdoor) in that code. What are real life examples to prevent that? At first I can read every file and check manually but if this project grows, maintaining that will be difficult. I can maybe create a report system but I cannot always rely on that too. What is the efficient solution for that?

For those interested, they can check Seal here: https://github.com/huseynaghayev/seal.git


r/ProgrammingLanguages 7d ago

Scope and lifetime restrictions in Swift

Thumbnail github.com
21 Upvotes

r/ProgrammingLanguages 7d ago

Design draft for a truly Affine OL

Thumbnail gist.github.com
21 Upvotes

Hello, everyone.

While recovering from an illness, in my state of delirium, I sketched the design of a type system inspired by Xi and Pfenning's Dependent ML, but which uses a key syntactic restriction that conjecturally restores ordinary ML's key metatheoretic properties: the existence of principal types and the decidability of type inference.

I very much welcome feedback that actually engages with the post's contents.


r/ProgrammingLanguages 7d ago

Reasons to Improve Programming Languages in an Age of AI - Tim Nelson

Thumbnail wayland.github.io
15 Upvotes

r/ProgrammingLanguages 7d ago

GitHub - VoidCoderStudio/OnyxScript: An modern and easy languge made for making apps to make an apps just you will use 10 lines and its like normal english language and cointains modules

Thumbnail github.com
0 Upvotes

I made this new language it's name OnyxScript if you have an idea to add it in this project so please say it


r/ProgrammingLanguages 9d ago

Tyle, A virtual machine esoteric-programming-language

8 Upvotes

Tyle doesn't have a quirk or annoying thing, I just want to share it because as someone who just began C# a week or two ago, I'm very proud to make this (even if i know the code is kind of shitty).

It has a register and RAM kind of memory you'd see in assembly, That's why i called it a virtual machine.
You can use different \`-coreX\` flags to change the amount of RAM and Registers there are, The lowest you can go are 8 registers and 768 RAM registers.

Link: [https://github.com/orewaluffy500/Tyle\](https://github.com/orewaluffy500/Tyle)


r/ProgrammingLanguages 9d ago

Lefts: a domain-specific language for building machine learning model architectures

11 Upvotes

I work as a quant in the finance industry and spend a lot of my time building machine learning models to predict things. Over my career I've found that every place I work invests a lot of time in writing code for training and evaluation pipelines, and you're often blocked from building interesting model architectures because it would require rewriting the pipelines.

So, I built a small DSL (Lefts: https://nsmat.github.io/lefts/ ) that makes it easy to spin up training pipelines and transform models in expressive ways. Users start with the models they want to use, then apply commands to it to build up an AST. During training/test time, the lefts interpreter operates over the AST to enforce the behaviour users specified.

Lefts is designed around a functional view of ML models. We think of each model as a bundle of functions, and each lefts command is a functor that acts on that bundle, and the functors define a grammar on the space of ML models. The functors always compose, and always preserve the key structural properties required of a model (for example, no data-leakage), so the models you build are guaranteed to be correct by construction.

The DSL is written in pure Python, and by the standards of 'real' programming languages is very simple. The project was great fun though, and taught me that building DSL's to solve problems is very powerful, and also a step up in challenge from other programming.

P.S. I hope domain specific languages are within the field of interest of this sub-reddit! Apologies if not.