announcements

Chemaclass 2026-05-08T08:25:26.402779Z

Phel v0.36 is out: Big push on Clojure-style Vars and numerics ๐Ÿ˜ ๐Ÿš€ https://github.com/phel-lang/phel-lang/releases/tag/v0.36.0 1. First-class Var: #'sym, alter-var-root, with-redefs, with-bindings, add-watch, alter-meta! 2. Numeric tower: Rational, BigInteger, BigDecimal, ratio literals 1/2, M-suffix, auto-promoting +' -' *' 3. New types: Uuid, MapEntry, PersistentQueue, PhpClass (/ int int) now returns Rational, faster test/REPL scans, phel test --last-failed and plenty more ๐Ÿ’ช

๐Ÿงฎ 2
๐ŸŽ‰ 8
2
Chemaclass 2026-05-08T08:30:42.525689Z

To be merged soon: jank Support running against Phel in #clojure-test-suite: https://github.com/jank-lang/clojure-test-suite/pull/873 > Kudos to @j.s @emma.audrey.g @jeaye!

๐Ÿ’ช 2
๐ŸŽ‰ 1
๐Ÿ’› 1
leifericf 2026-05-08T09:21:13.320339Z

mino - An embeddable Clojure-inspired Lisp, written in portable C99 Hello, friends! As some of you might know, I'm a game developer working on massively multiplayer online games. You might also know that Lua has become the de facto standard scripting language for games, and that it comes with a bunch of problems that Clojure solves. Most of these problems stem from Lua's global state and its singular mutable table-based data structure. This causes a lot of issues where game designers and players write nefarious Lua code that often crashes or degrades the game engine. The host application does not have sufficient control over what scripters are allowed to do. This question has been in the back of my mind for quite some time: "What if we could have Clojure embedded in our game engine?" That might make a whole class of problems go away, just like Clojure did for Java. To answer that question, I'm working http://mino-lang.org/about/. It's an experimental clean-room implementation of Clojure in pure ANSI C/C99, which can be embedded into any host language that supports a C FFI/ABI. The host is in charge of deciding what each runtime is allowed to do, and can run thousands of isolated runtimes in parallel. These pages highlight where it currently differs from Clojure: โ€ข http://mino-lang.org/documentation/coming-from-clojure/ โ€ข http://mino-lang.org/documentation/compatibility-matrix/ โ€ข http://mino-lang.org/documentation/intentional-divergences/ There are also documents describing the design, such as http://mino-lang.org/documentation/garbage-collection/. โš ๏ธ Obligatory AI disclaimer/warning: This is a solo project that makes heavy use of "AI." I understand that's controversial to many people, and I don't want to instigate an ethical, sociopolitical or philosophical debate about the use of "AI." It's the only way a working father with a hectic life is able to attempt to realize a grand vision "in anger" in his sparse spare time. Most of my time has been spent thinking about the problems that are unique to the world of embedded scripting, and specifying in painstaking detail how I want things to work. Most of mino's source code was written by AI. Please forgive me for my graven sins. Because of this, mino is changing rapidly and is highly unstable. View this project as an early experiment/proof of concept, which might fail spectacularly. The embedding API is not stable. My plan is to embed it in our game engine as soon as possible to see how well it works in practice, in real-world scenarios.

๐Ÿ‘€ 6
๐ŸŽ‰ 15
fricze 2026-05-11T08:06:36.931379Z

@leif.eric.fredheim you've been looking at Rust, right? what got you back to C?

fricze 2026-05-11T08:07:16.228889Z

genuinely curious, cause I'm working on AI-built "Clojure" in Rust ๐Ÿ˜›

nooga 2026-05-11T08:08:45.153909Z

which one?

fricze 2026-05-11T08:09:00.290679Z

not public yet

fricze 2026-05-11T08:09:09.890619Z

just lives between me and Claude

๐Ÿ‘ 1
nooga 2026-05-11T08:11:24.188469Z

@tylertracey09 is also making one in rust https://clojurians.slack.com/archives/C03RZGPG3/p1776625152001149

๐Ÿ‘€ 2
fricze 2026-05-11T08:11:39.535849Z

oh nice

nooga 2026-05-11T08:12:50.507769Z

I can't get over Rust's weirdness, tried this thing 7 times and rage quit every time it started destroying my program with helpful circular compiler suggestions

๐Ÿ˜„ 1
fricze 2026-05-11T08:12:56.880129Z

"Type-hinted functions compile to native code through MLIR and LLVM." โ€“ that's almost exactly what I'm aiming for

๐Ÿ‘ 1
fricze 2026-05-11T08:13:23.309529Z

I actually love Rust, it is verbose, but it's first low-level language I actually wrote something working in

leifericf 2026-05-11T08:13:43.119369Z

@andrzej.fricze The idea was using C99 to achieve a minimal footprint and maximal portability (for the embedding use case) with no special toolchain dependencies. Following "the Lua model." Also, I have no experience with Rust, but I do have some experience with C and C++.

๐Ÿ‘ 2
fricze 2026-05-11T08:13:55.660119Z

ok, that makes sense

leifericf 2026-05-11T08:14:49.292509Z

I also like the dump simplicity of C, hehe

๐Ÿ˜„ 1
fricze 2026-05-11T08:15:19.225289Z

I have basically zero experience with any C, but already have some with Rust, so I'll stay on the path. my idea is to have Clojure-ish language with hints that allow AOT compilation as close to metal as possible

๐Ÿ‘ 1
fricze 2026-05-11T08:15:36.515549Z

Clojure with bit of SBCL soul

nooga 2026-05-11T08:16:03.063109Z

check https://github.com/carp-lang/Carp

๐Ÿ‘ 1
๐Ÿ‘€ 1
leifericf 2026-05-11T08:16:16.329469Z

The core idea I started with is being able to embed mino into any host language that supports C FII, which is virtually all languages (including Rust).

fricze 2026-05-11T08:21:34.762249Z

nice. it's purely interpreted, right? tree-walking and interpreting right away? or is there something happening in between?

1
fricze 2026-05-11T08:22:42.180559Z

btw. I didn't know about https://github.com/rekola/nanoclj. seems Clojure is growing into language having the most implementations ever ๐Ÿ˜…

๐Ÿ˜… 1
leifericf 2026-05-11T09:35:52.580969Z

@andrzej.fricze I'm working on a bytecode VM experiment now.

๐Ÿ‘ 1
leifericf 2026-05-11T13:15:03.740259Z

@xnooga, early result from bytecode VM experiment:

./mino -e '(defn run [] (let [j 10000000] (loop [i 0 j 10000000] (if (zero? j) i (recur (inc i) (dec j)))))) (time (run))'
Elapsed time: 169.048 ms
9006 ms -> 4785 ms -> 169 ms Now weโ€™re getting somewhere!

leifericf 2026-05-11T13:15:44.200989Z

Should be able to match Lua 5.5 at ~70 ms with some more work, I think.

nooga 2026-05-11T13:33:30.770149Z

what's your value representation?

leifericf 2026-05-11T14:08:46.333019Z

Right now, just to get something working: 64-bit tagged-pointer Value* (3 low tag bits), so ints/bool/nil/char are inline immediates and everything else is a heap object pointer.

leifericf 2026-05-11T14:46:31.293659Z

I have some ideas on how to leverage the fact that Clojure has persistent and immutable data structures, so the VM can probably make some bold assumptions that wouldn't be possible to make in other contexts. Messing about with that now.

๐Ÿ’ฏ 1
1
nooga 2026-05-11T15:29:49.435089Z

teehee

๐Ÿ”ฅ 1
๐ŸŽ‰ 1
nooga 2026-05-11T15:31:10.823009Z

note that this is basically cheating by pattern matching, I'm trying to do "hotspot opts"

๐Ÿ’ก 1
nooga 2026-05-11T15:33:05.603859Z

added a way to detect hot loops and lower to optimized bytecode which only does arithmetic and comparisons fast

๐Ÿ‘ 1
nooga 2026-05-11T15:33:24.407859Z

seems to work with recur and TCO too

nooga 2026-05-11T15:33:31.459589Z

but it's cursed and experimental

leifericf 2026-05-11T15:36:15.913989Z

I'm refreshing my memory about how Erlang's BEAM works.

leifericf 2026-05-11T16:51:27.705739Z

Hehe, found a solid optimization.

./mino -e '(defn run [] (let [j 10000000] (loop [i 0 j 10000000] (if (zero? j) i (recur (inc i) (dec j)))))) (time (run))'
Elapsed time: 28.148 ms
9006 ms -> 4785 ms -> 169 ms -> 28 ms

๐Ÿ‘€ 3
nooga 2026-05-11T16:59:49.332149Z

i got it down to ~170 using legit means just now

nooga 2026-05-11T17:00:03.812059Z

but anything lower than that is going to be very hard

nooga 2026-05-11T17:00:09.977979Z

@leif.eric.fredheim what did you do?

๐Ÿ‘ 1
leifericf 2026-05-11T17:37:12.628069Z

@xnooga, several things, but this is what yielded the biggest gain in that specific scenario: > Fused Counted-Loop Opcodes > > The compiler recognizes two common (loop ...) shapes: > >

(loop [i 0]     (if (zero? i)  (recur (dec i))))
> (loop [i 0 j N] (if (zero? j)  (recur (inc i) (dec j))))
> > and emits a single fused opcode (`OP_LOOP_INT_DEC` / > OP_LOOP_INT_DEC_INC) at the recur target. Each iteration is > now one decode + one tag-bit check + one (or two) tagged-int > updates + one back-jump-to-self -- the per-iter ZERO_INT_P, > JMPIFNOT, DEC_I, INC_I, MOVE, MOVE, JMP cascade collapses to a > single fetch. > > What this leverages from Clojure: loop / recur is the > canonical iteration form and its bytecode shape is stable and > homoiconic. Persistent bindings mean each step depends only on > the same binding's prior value - no aliasing between iterations > - so the fused step can update the registers in place without > the temp-register staging the generic recur emission needs to > avoid clobbering. Integer-overflow semantics are preserved: > dec MIN_INT and inc MAX_INT decline the fused step and fall > back to the boxed-int slow lane so the throw still fires. > > Verification: 1 571 tests / 7 353 assertions green on release, > ASan, UBSan. tight-loop-10M: 155 ms -> 15-18 ms (9x), well > under Lua's 72 ms. Other benches steady.

๐ŸŽ‰ 1
leifericf 2026-05-11T17:39:29.718439Z

But I'm not sure yet whether that won't break in insidious ways in other places.

leifericf 2026-05-11T17:45:19.897329Z

I've tracked and benchmarked each change, and will release that with the updated changelog if/when I merge the experimental branch.

nooga 2026-05-11T18:41:27.332009Z

yesh fused opcodes are OP

โšก 1
nooga 2026-05-11T18:42:22.809109Z

I've had biggest gains on them in paserati, and it lends itself to this because the VM is beefy

๐Ÿ’ก 1
nooga 2026-05-11T18:42:40.473809Z

JS is orders of magnitude more complex than clojure

๐Ÿ’ฏ 2
nooga 2026-05-08T09:45:43.680489Z

hey @leif.eric.fredheim, welcome to the club of Clojure implementors ๐Ÿ˜„

๐Ÿ™‡โ€โ™‚๏ธ 2
leifericf 2026-05-08T09:46:04.066379Z

Thanks! I just saw your implementation as well. Awesome!

๐Ÿ™ 1
leifericf 2026-05-08T09:46:38.305209Z

I thought about doing a Go implementation at first, but decided ANSI C made more sense for the embedded use case.

leifericf 2026-05-08T09:47:01.848849Z

I also did a PoC implementation in C++ and Rust, before landing on ANSI C ๐Ÿ˜…

leifericf 2026-05-08T09:47:32.634629Z

Borrowing the things that Lua got right.

nooga 2026-05-08T09:47:35.575249Z

are you running https://github.com/jank-lang/clojure-test-suite ?

leifericf 2026-05-08T09:47:43.215689Z

Yeah, mino passes that.

leifericf 2026-05-08T09:48:06.551179Z

Or... At least it did last time I checked ๐Ÿ˜… Lemme' check again.

leifericf 2026-05-08T09:48:41.672989Z

mino also borrows the "actor model" from Erlang/BEAM, so that isolated/sandboxed runtimes are able to talk to each other without sharing state. I need that for cooperating bots.

nooga 2026-05-08T09:49:24.440359Z

wait, does it run all of these from source? https://github.com/leifericf/mino/blob/main/tests/compat/run.clj

leifericf 2026-05-08T09:49:50.926629Z

Some of them. I'm using those as an "extended test suite."

henrik 2026-05-08T09:51:51.737619Z

I for one am loving this recent reaffirmation of Clojure as a symbiote that can make itโ€™s way into anything. If AI helps speed that up, or improve the quality of the symbiosis: all the better. Kudos!

๐Ÿ‘ 1
p-himik 2026-05-08T09:53:04.035019Z

Nice! I myself mull over writing a "Lua Clojure" - I keep stumbling upon Lua everywhere and I just don't like the language at all. And Fennel doesn't quite cut it.

nooga 2026-05-08T09:53:38.456639Z

this is a tree walking interpreter, right? how's perf?

nooga 2026-05-08T09:53:54.336149Z

I'll add it to my bench comparison

p-himik 2026-05-08T09:54:08.320159Z

BTW this is something you could be interested in: https://dependablec.org/ > the plainest possible C, that doesn't require any extensions, compiler settings, build steps

๐Ÿ‘€ 1
1
leifericf 2026-05-08T09:55:21.933999Z

Yes! Thanks, @p-himik - I can't believe I haven't run into that yet.

p-himik 2026-05-08T09:56:34.720199Z

You might also be interested in what Eskil Steenberg Hald does in general. :) He's the guy behind Dependable C.

๐Ÿ™Œ 1
leifericf 2026-05-08T09:58:17.533099Z

@xnooga: The performance is quite shit in some cases to be honest. Here's the result of @borkdudeโ€™s test loop:

./mino -e "(time (let [x 0 j 10000000] (loop [i 0 j 10000000] (if (zero? j) i (recur (inc i) (dec j))))))"
Elapsed time: 9006.64 ms
I have a page that goes in a bit more detail here: http://mino-lang.org/documentation/performance/

nooga 2026-05-08T09:59:10.063049Z

I'd say perf is less important than completeness

๐Ÿ’ฏ 1
nooga 2026-05-08T09:59:44.774679Z

you can always make this into a bytecode compiler or a simple JIT later working against a slow baseline

๐Ÿค” 1
leifericf 2026-05-08T09:59:47.810709Z

Yeah, I'm thinking to do a heavy push on performance after it's on-par with "the canon" in terms of features.

nooga 2026-05-08T10:00:10.382629Z

do you have results of the clojure-test-suite?

leifericf 2026-05-08T10:00:42.407219Z

Not easily available where I sit now! (I've got everything set up on my Mac at home.)

nooga 2026-05-08T10:01:05.840989Z

please do share when you have a chance, I'm very curious :)

๐Ÿ‘ 1
2
dominicm 2026-05-08T14:23:24.763549Z

https://tratt.net/laurie/blog/2026/retrofitting_jit_compilers_into_c_interpreters.html Feels relevant while we're throwing around ideas ๐Ÿ˜…

๐Ÿ‘€ 1
nooga 2026-05-08T14:27:07.493219Z

yeah, meta tracing

nooga 2026-05-08T14:27:41.473689Z

there was a clojure impl called pixie, it was written in rpython and used pypy to obtain a blazing fast JIT

๐Ÿ’ก 1
leifericf 2026-05-08T16:44:34.354829Z

@xnooga, here are the current test results. Summary:

Suite files processed: 223
  OK (all assertions pass): 166
  Test failures:            49
  Load errors:              4
  Process crashes (segv):   2
  Timeouts (>30s):          2
  No summary line:          0

Aggregate (across files that completed): 207 tests, 4542 assertions: 4472 passed, 41 failed, 29 errors
I added it to CI/CD, so you can see the whole run/details https://github.com/leifericf/mino/actions/runs/25565629340/job/75048406312. There are still quite a few tests that don't pass. I'm working on those.

๐Ÿ™Œ 1
nooga 2026-05-08T16:48:22.637389Z

nice!

leifericf 2026-05-08T16:48:37.145419Z

I'm not 100% sure it makes sense to pass all tests in the embedded context as it might imply bloating up the C codebase significantly in some cases.

leifericf 2026-05-08T16:48:57.072419Z

And I also want the artifact to be as small as possible. It's around 300 kb now.

leifericf 2026-05-08T16:49:22.016749Z

But I'll be pushing it as far as possible within reason ๐Ÿ™‚

nooga 2026-05-08T16:49:29.553459Z

yeah, that makes sense

nooga 2026-05-08T16:49:38.315449Z

also, this is for embedding in games, right?

leifericf 2026-05-08T16:49:57.569629Z

Embedding in general, I'd say. But my particular need and focus is on games.

nooga 2026-05-08T16:50:03.946909Z

Clojure is quite interesting choice for a game scripting language ๐Ÿ˜„

leifericf 2026-05-08T16:50:24.336449Z

Basically any situation where one might use Lua.

nooga 2026-05-08T16:50:31.233609Z

not that I don't support this decision wholeheartedly!

leifericf 2026-05-08T16:52:10.901339Z

The pain of dealing with designer/user-written Lua scripts is real ๐Ÿ˜…

leifericf 2026-05-08T16:52:32.496549Z

At first, I was only going to work on a very small subset of Clojure's core.

leifericf 2026-05-08T16:52:46.177629Z

But as it turns out, doing more didn't increase the size that much.

nooga 2026-05-08T16:56:08.841619Z

as long as you're not pulling deps machine code is quite small

๐Ÿ‘ 1
leifericf 2026-05-08T18:05:39.701559Z

The only "dependency" so far is imath - But it's vendored C code.

nooga 2026-05-08T18:06:22.017189Z

are you producing static binaries?

leifericf 2026-05-08T18:07:20.121949Z

Yeah, mino is available in "standalone" via Homebrew and Scoop.

nooga 2026-05-08T18:07:42.910709Z

300kB is nice, mine is 10MB ๐Ÿ˜‚

leifericf 2026-05-08T18:08:05.214389Z

10MB is still quite small, though!

leifericf 2026-05-08T18:08:25.693849Z

But I need to spawn up to 100.000 runtime instances to simulate players (for game engine load testing; simulating player behavior).

leifericf 2026-05-08T18:08:38.699049Z

So far, I've only tested it with 10K instances on my MacBook.

leifericf 2026-05-08T18:10:47.060789Z

I might need to add support for distribution across several physical machines at some point (similar to how Erlang/BEAM does it).

leifericf 2026-05-08T18:11:09.989189Z

But now I'm leaning towards that being the responsibility of the host.

nooga 2026-05-08T18:14:43.319009Z

BEAMy clojure could be very fun

leifericf 2026-05-08T18:34:00.983599Z

Indeed! I migrated to Clojure from the Erlang/Elixir community in 2020, and I've been following https://clojerl.org and https://lfe.io ๐Ÿ™‚

leifericf 2026-05-10T12:59:07.101799Z

@xnooga, I've got some more tests passing now:

Suite files processed: 223
  OK (all assertions pass): 214
  Test failures:            8
  Load errors:              1
  Process crashes (segv):   0
  Timeouts (>30s):          0
  No summary line:          0
These are the tests with failing assertions:
abs.cljc  fail=0  error=1  pass=9
dec.cljc  fail=1  error=0  pass=13
derive.cljc  fail=0  error=1  pass=2
inc.cljc  fail=1  error=0  pass=14
parents.cljc  fail=0  error=1  pass=5
reduce.cljc  fail=0  error=1  pass=7
short.cljc  fail=1  error=0  pass=23
vec.cljc  fail=1  error=0  pass=19

nooga 2026-05-10T13:01:16.730979Z

how many assertions total?

leifericf 2026-05-10T13:05:28.011729Z

Aggregate (across files that completed): 219 tests, 5389 assertions: 5381 passed, 4 failed, 4 errors
The latest CI/CD run is https://github.com/leifericf/mino/actions/runs/25626243600/job/75221914104.

nooga 2026-05-10T13:09:57.231159Z

congrats

leifericf 2026-05-10T13:14:04.206319Z

Thanks, although I'm still finding plenty of bad bugs ๐Ÿ˜…

leifericf 2026-05-10T13:14:54.232459Z

And the STM and Agent implementation isn't complete yet.

nooga 2026-05-10T13:15:02.738709Z

same

nooga 2026-05-10T13:16:33.050859Z

4696 / 4921 assertions, 217 files ๐Ÿค”

nooga 2026-05-10T13:16:44.192929Z

one of us must be counting the assertions wrong

leifericf 2026-05-10T13:16:47.247509Z

Yeah, something fishy there. I think maybe my test harness is bugged.

nooga 2026-05-10T13:16:54.625149Z

or mine is bugged ๐Ÿ˜„

๐Ÿ˜‚ 1
nooga 2026-05-10T13:17:00.460679Z

I'll look into this

nooga 2026-05-10T13:18:02.522639Z

that was before I stopped double counting ๐Ÿ˜„

leifericf 2026-05-10T13:57:04.265869Z

Ah, nice! I didn't know there was a Slack channel for it.

leifericf 2026-05-10T21:49:19.566689Z

Did a significant performance push today. I think this is as fast as it gets without going bytecode/JIT:

mino -e "(time (let [x 0 j 10000000] (loop [i 0 j 10000000] (if (zero? j) i (recur (inc i) (dec j))))))"
Elapsed time: 4785.35 ms
That's down from 9006.64 ms. http://mino-lang.org/documentation/performance/ has more fresh numbers.

leifericf 2026-05-10T21:50:23.045029Z

Tempted to take a stab at a register-based bytecode interpreter ๐Ÿ˜… #MustResist

nooga 2026-05-10T21:58:47.278409Z

good idea, if I were making let-go VM today it would be register based, even with stack allocation

nooga 2026-05-10T21:59:01.565459Z

I did one for paserati and it behaves much better than a stack vm

leifericf 2026-05-10T22:05:04.795009Z

I'll do an experiment/"spike" and see how it goes.

nooga 2026-05-10T22:06:38.346849Z

it's going to take some yak shaving ๐Ÿ˜‰

๐Ÿ’ฏ 1
leifericf 2026-05-10T22:06:50.263499Z

But I don't think I'll ever do JIT because it's so much code, especially tracing JIT. If so, it would likely be a simpler copy-and-patch JIT.

leifericf 2026-05-10T22:07:16.253409Z

If I want to keep mino small for embedding.

nooga 2026-05-10T22:08:06.323949Z

I made a small JIT and you can fit this into ~1000LOC for a single OS/arch, the problem starts whenm you want it to be portable

nooga 2026-05-10T22:08:34.378629Z

forget tracing ๐Ÿ˜„

leifericf 2026-05-10T22:08:35.563419Z

LuaJIT is about 30KLOC (also C).

nooga 2026-05-10T22:08:46.743459Z

yeah, it will bloat

๐Ÿ’ฏ 1
leifericf 2026-05-10T22:10:54.528719Z

But it's insanely fast. LuaJIT 2.1 (tracing) does https://clojurians.slack.com/archives/C06MAR553/p1778449759566689?thread_ts=1778232073.320339&cid=C06MAR553 in ~4 ms.

leifericf 2026-05-10T22:12:29.223649Z

I measured Babashka at 237 ms on my machine (median of 3 runs).

leifericf 2026-05-10T22:13:24.502379Z

Lua 5.5 (register-based bytecode) does it in ~70 ms.

leifericf 2026-05-10T22:14:03.016319Z

So I'm thinking best case for mino would be around ~70 ms.

nooga 2026-05-10T22:14:25.424069Z

yes, tracing JITs are brutal, the machine code for this loop in LuaJIT would probably be something like label inc dec compare jump

๐Ÿ˜… 1
nooga 2026-05-10T22:15:19.668879Z

to reach even 70ms you'd have to figure out good value representation and have a decent optimizer

leifericf 2026-05-10T22:17:41.046109Z

Yeah, more realistic is around Babashka's performance, I think.

leifericf 2026-05-10T22:17:47.865809Z

But even that will be difficult.

nooga 2026-05-10T22:18:11.903929Z

go incremental, bytecode VM should get you in babashka ballpark

๐Ÿ‘ 1
leifericf 2026-05-12T07:23:36.720179Z

@xnooga I've merged the bytecode VM to main now. You will find a detailed log of all changes https://github.com/leifericf/mino/blob/main/CHANGELOG.md if you're curious or want to try some of those things yourself. All the bytecode VM changes are from version https://github.com/leifericf/mino/blob/main/CHANGELOG.md#v01050--bytecode-vm-foundation to https://github.com/leifericf/mino/blob/main/CHANGELOG.md#v01450--fusion-cycle (inclusive). Note that some of those changes, especially the last opcode fusion stuff, are potentially quite flaky and dangerous. But I've added a bunch of tests and run some exploratory adversarial tests, and it seems fairly stable. The challenge is to know in advance which aspects of Clojure are truly static and predictable, so it's safe to treat them as axioms when optimizing the bytecode (I have a separate idea about that involves a formal and executable Clojure language spec and โ€œmeta-analysis engineโ€ written in core.logic or Prolog with introspection, but that will be a separate huge project later).

leifericf 2026-05-12T11:01:42.865269Z

http://mino-lang.org/documentation/bytecode-vm/

nooga 2026-05-12T11:49:22.863939Z

wow, great progress, no notes

๐Ÿ‘ 1
nooga 2026-05-12T12:20:37.284659Z

also, comes along really really fast ๐Ÿ˜„

leifericf 2026-05-13T07:31:53.933569Z

I've been practicing coding with heavy AI use almost every day for 6 months, as I'm in charge of those experiments at work. Iโ€™ve built several tools to help with that, like https://noumenon.leifericf.com (and other proprietary tools). That's why it's so fast. But there are undoubtedly serious downsides to that approach as well. mino sort of doubles as my experimentation/test bed for AI-driven coding, improving my Claude Code skills and custom sub-agents, and other tools Iโ€™m building. It's taking a stab at building something relatively large and complex with AI, learning how to write better specs and tests for AI agents, trying different LLMs, writing better prompts, and adapting my workflow for AI agent use, etc. I tried to pick a serious, real project Iโ€™ve been thinking about for some time and, at the same time, solve a real pain point in game engines for work.

1
1
nooga 2026-05-13T08:53:54.265199Z

I understand this completely, I've been early adopter of these tools myself. Completely understand the idea of having an experimental project outside work as a lab for dialing these workflows in. Last April I started https://github.com/nooga/paserati and managed to get it to 98.4% compliance with latest ecma262 spec - that's ~30k tests proving that the approach works. I have many thoughts about this but not sure if this thread is a good place for this conversation ๐Ÿ˜„

๐Ÿ™Œ 1
nooga 2026-05-13T08:58:14.543609Z

let-go was hand-coded and boosted with AI, paserati is completely "vibe coded"

leifericf 2026-05-13T09:37:03.179999Z

Yeah. Unfortunately, there is quite a lot of irrational fear and hostility against the use of AI. The topic is a bit controversial, like politics and religion. I'm trying to remain rational, skeptical, and pragmatic; focusing on what works and what doesn't work by actually trying things out for myself on real problems.

leifericf 2026-05-13T09:38:15.488999Z

I'm by no means zealous about using AI, and I understand that there are many legitimate criticisms. At the moment, I'm viewing it as "just another tool to learn and evaluate," because it seems like it's here to stay for better and for worse.

leifericf 2026-05-13T09:38:49.095129Z

I hate it and love it at the same time ๐Ÿ˜‚

nooga 2026-05-13T09:40:00.584309Z

yes, I've been called names and nearly banned from places for discussing paserati, even though the communities there seemed interested in it last year ๐Ÿ˜…

๐Ÿ‘€ 1
leifericf 2026-05-13T09:40:17.617879Z

Sameโ€ฆ

leifericf 2026-05-13T09:41:47.967459Z

But as a former pastor-in-training and aspiring theologian/Christian apologist for 10+ years, I have become somewhat immune to rejection and contention, hehe

๐Ÿ˜‡ 1
nooga 2026-05-13T09:42:20.798809Z

I have a huuge blogpost about using AI and the paserati experience, its technological and cultural implications, my feelings, much like yours are quite ambivalent: excitement vs dread

๐Ÿ’ฏ 1
leifericf 2026-05-13T09:42:56.619809Z

The main objections i hear from work are ethical and environmental.

nooga 2026-05-13T09:44:02.842009Z

hm, is it ok if I DM you? I'm thinking we should move this convo off announcements thread :D

1
leifericf 2026-05-13T09:44:12.663909Z

Ah, I thought this was DM! Haha

leifericf 2026-05-13T09:44:14.001849Z

My bad

fricze 2026-05-13T09:45:57.108719Z

๐Ÿ˜ž I hoped that discussion will develop here ๐Ÿ˜„

leifericf 2026-05-13T09:46:29.591999Z

Haha, maybe such discussions deserve a channel of their own.

๐Ÿ’ฏ 1
fricze 2026-05-13T09:47:12.734169Z

I started hugely AI-skeptical, then organized few editions of AI conference and right now I'm working in startup building AI-guided coding platform

fricze 2026-05-13T09:47:34.735639Z

and TBH I've no idea what is my opinion about AI ๐Ÿค–

fricze 2026-05-13T09:47:52.865239Z

I have probably 3 or 4 different ones and they change hourly

nooga 2026-05-13T09:48:32.114189Z

maybe we could start a thread in #mino? I think we are pinging a bunch of ppl now, not sure ๐Ÿค”

henrik 2026-05-13T09:49:36.540229Z

I think there are considerations that sound ethical at first, but are actually pragmatic: โ€ข If LLMs are the new junior devs, weโ€™re currently at the all-time high of senior devs. What happens when they retire? โ€ข If you donโ€™t understand what your app is doing, there might be problems further down the line. This is already true for complex enough systems, but LLMs add an additional layer of distance between the person and the artefact.

โ˜๏ธ 1
leifericf 2026-05-13T09:50:10.637629Z

Let's make a channel for AI stuff, I guess. Unless one exists already.

henrik 2026-05-13T09:50:20.677119Z

#ai-assisted-coding

leifericf 2026-05-13T09:50:31.936619Z

Ah, nice

leifericf 2026-05-13T09:51:27.930629Z

As for myself, I'm really only interested in the practical applications of AI.

leifericf 2026-05-13T09:52:05.077789Z

Other people with more time can fight over the ethical and sociopolitical stuff.

leifericf 2026-05-13T09:53:20.618759Z

Not that I think it's unimportant or uninteresting. I just don't have enough time or energy to learn about all the details and nuances of those issues.

fricze 2026-05-13T09:54:54.218739Z

it's also hard to know what will be the long-term impact

fricze 2026-05-13T09:55:39.714819Z

do we know will Anthropic be on the stage in a year? I've no idea. do we know how much will new GPT cost in a year? I've no idea

fricze 2026-05-13T09:56:20.825629Z

do we know how the law will change to accomodate for code or art generated with help of AI? also no idea ๐Ÿ˜›

fricze 2026-05-13T09:57:18.555309Z

we can only guess and do our best in learning how to harness this tools

leifericf 2026-05-13T09:57:35.885039Z

Yes. For example, some argue against AI because of power consumption. Others argue for AI because the power consumption encourages the long-term development of technologies like clean nuclear energy and other methods. I don't know either way.

leifericf 2026-05-13T09:58:31.956859Z

What I can do is figure out how to use (and not use) AI in my life.

๐Ÿ‘ 1
fricze 2026-05-13T09:59:23.355239Z

yeah, apparently at some point cars were treated like solution to pollution in cities, because you'd have so much horse shit laying around that air used to be just filthy

fricze 2026-05-13T10:00:25.823209Z

so maybe AI will, in the end, force the world to develop better technology for creating/storing energy

fricze 2026-05-13T10:00:31.966849Z

let's hope for that ๐Ÿ˜„

fricze 2026-05-13T10:01:21.904499Z

and I'm not trying to make some particular analogy, just rather: fuck we really don't know what future brings

๐Ÿ’ฏ 1
leifericf 2026-05-13T10:01:47.436289Z

I imagine all the world's PCs, cellphones, and other tech also use a significant amount of energy. Not to speak of electric vehicles, heating, refrigerators, and other power-consuming inventions we take for granted today. Why is nobody protesting those things?

fricze 2026-05-13T10:03:11.152029Z

well they are useful ๐Ÿ˜„

leifericf 2026-05-13T10:05:13.539689Z

I suspect it's because those things are old, boring, and normalized. AI is new and scary, with many unknowns.

leifericf 2026-05-13T10:10:19.664479Z

I think the only thing I'm comfortable saying with a fair degree of certainty is that AI is here to stay in some shape or form for the remainder of my lifetime. That's my operating assumption. I can choose not to deal with that. Instead, I have chosen to adapt and make the best of it.

leifericf 2026-05-13T10:11:52.593709Z

But I don't resent or criticize more conservative devs who went the opposite way.

nooga 2026-05-13T10:14:28.450219Z

I had a heated argument with a person who pointed out all the downsides - I ask them if they drive and they said it's different because in US you risk unemployment if you cannot get to work by car. The same person also stated that they cycle /dev/urandom > coding agent > /dev/null because their boss checks token usage and mandates that all developers use coding agents. This is like leaving your car on idle in protest of the oil industry. And this person could not see the contradiction while claiming that this is good because "the slop does not get out into the world". I completely agree with many of the problems - resource consumption, brain rot, harmful generated content, unclear IP story, slop. But at the same time I don't see how LLM output in itself can be such big of a problem - it's text, it's inert unless executed, and since these generators are tools it is up to us humans to curate and execute whatever comes out.

๐Ÿ‘ 1
leifericf 2026-05-13T10:15:37.629259Z

It's the same story with all contentious topics like carnivores vs vegetarians. There has always been and always will be topics that divide groups of people. But each person can choose how to engage, integrate and react.

nooga 2026-05-13T10:16:20.369079Z

ultimately I think it's a mix of justified fear and dogma enforced by bad experiences ๐Ÿคทโ€โ™‚๏ธ IMO it's better to know your enemy if you think it's your enemy

๐Ÿ’ฏ 1
nooga 2026-05-13T10:22:02.563749Z

what's interesting, when let-go hit the first page of hackernews people were annoyed by my README with em-dashes but were excited by the code itself

๐Ÿ˜ 1
leifericf 2026-05-13T10:22:03.279679Z

If there is one lesson I learned in my decade as a Pentecostal pastor-in-training and my subsequent self-deconversion, and the bringer of https://www.streetepistemology.com to Norway, it's this: it's not worth your time and energy talking to people who are https://en.wikipedia.org/wiki/Epistemic_closure and thus incapable of critically evaluating and revising their own belief-forming process (epistemology). I often see the same pattern in these AI-related debates.

๐Ÿ‘€ 1
henrik 2026-05-09T07:17:02.512979Z

For someone who's not familiar with Lua, how does the binary size compare to what Lua produces?

leifericf 2026-05-09T07:44:19.956769Z

The total memory footprint is about 500 KB. A minimal, stripped down version can be under 64 KB. mino will likely land somewhere in the middle.

๐Ÿ‘Œ 1
henrik 2026-05-09T07:49:12.525239Z

I don't know if it's intended for it, but the size and boot time would make it plenty fast/small for eg. edge runners as well.

leifericf 2026-05-09T07:49:16.613769Z

I've made it modular as well in a similar way to Lua. So the host can install only what it requires to keep the size down.

leifericf 2026-05-09T07:50:05.733619Z

But the standalone binary ships with everything included by default.

leifericf 2026-05-09T08:00:03.765779Z

I suppose there could be some use cases I haven't thought about where it could be a good fit. I've mainly focused on embedding constraints, but that might inadvertently lead to advantages in other scenarios.

nooga 2026-05-09T16:15:54.048029Z

@henrik re edge runners, I'm trying to set up let-go as a custom runtime on AWS Lambda, my hope is that it will start in less than 10ms there , which is not to shabby for a lambda

๐Ÿ‘ 1
leifericf 2026-05-09T17:38:57.766949Z

Last time I checked, mino did ./mino -e '(+ 1 2)' in 6.8 ms. When a host creates one runtime upfront (`mino_state_new` + mino_install_all) it starts in 3.5 ms. Measured on my M3 MacBook Pro. But a lot has changed since last I measured. I need to update the performance page with new numbers, and I suspect it's slower now (because of more lazy-bundled libs).

leifericf 2026-05-09T17:40:40.231289Z

But I also haven't spend much effort on optimizing things yet. The speed is just a coincidence at this point.

nooga 2026-05-09T17:40:48.532729Z

I think that you might be spending precious miliseconds on parsing and tree-walking core libs, let-go caches them as bytecode so there is almost no penalty for loading the stdlib

leifericf 2026-05-09T17:43:48.443709Z

Yeah, I'm still a bit torn about whether or not to go in the AST/JIT direction. I'm not sure how much it will bloat up the footprint and make the code base more difficult to reason about. And Iโ€™m not sure if it provides more pros than cons to the embedding story.

leifericf 2026-05-09T17:44:22.566019Z

One tricky aspect is also how to strip out as much as possible and allow the host to install only what it wants in the runtimes.

leifericf 2026-05-09T17:44:45.067049Z

Lua provides some general good design direction for those things, though.

leifericf 2026-05-09T17:45:28.244019Z

There is also LuaJIT.

leifericf 2026-05-09T17:47:19.174519Z

My thinking is to get mino โ€œfeature completeโ€ and then try to get as much performance out of it before adding additional layers. But Iโ€™m not sure.

Ty 2026-06-02T14:49:57.815249Z

Very cool! Not sure how I missed this

Ty 2026-06-02T14:51:02.660609Z

I ended up going down a bit of a rabbit hole on my end. If anyone has heard of parrot from nvidia. I've been trying to build a DSL for automatic kernel fusion. Its pretty finicky

Ty 2026-06-02T14:52:05.111789Z

Ironically I feel like this is something where the power of lisp could be felt clearly by non believers, if you will. If you look at parrot codebase, it's rough. I mean maybe it's transparent to people that think that way regularly. Not to me, though.

Ty 2026-06-02T14:52:33.347859Z

Something akin to Hy for Mojo could be cool as well

Ty 2026-06-02T14:53:12.450139Z

Of course I put together โ€œClojoโ€ but it's more of a gimmicky look ma no hands vibe. Could be neat to see it through, though.

Ty 2026-06-02T14:54:30.761249Z

To chime in on the AI discussion. I'm honestly incredibly conflicted about using LLMs myself. I've been avoiding it for personal projects recently because it definitely starts to impact my own attention to detail and skill I feel. There's no opportunity to avoid it at work anymore

๐Ÿ‘ 2
hlship 2026-05-08T16:45:15.564979Z

dexter 0.1-beta-1 Dexter is an interactive, browser-based tool for visualizing and exploring the artifact dependency graph of JVM projects. It installs as a command line tool, dexter, and understands deps.edn, Maven, and Leiningen build files. https://github.com/hlship/dexter Even trivial projects accumulate dozens, even hundreds, of transitive dependencies, making it impossible to produce a meaningful static graph or to easily diagnose version conflicts buried deep in the tree. Dexter addresses this by letting you navigate the dependency hierarchy interactively: select any artifact to see what depends on it (dependants) and what it depends on (dependencies), with version mismatches highlighted at a glance. Version 0.1-beta-1: โ€ข Properties panel is now open at all times โ€ข Windows Install โ€ข Bug fixes

๐Ÿ†’ 6
๐Ÿ‘€ 2
2
๐ŸŽ‰ 3
imre 2026-05-08T17:13:57.122119Z

found it useful immediately, thank you!

hlship 2026-05-08T17:25:19.616279Z

Music to my ears!

imre 2026-05-08T21:12:21.433309Z

One suggesion: when the currently selected library has many direct dependencies, only a few of them fit on screen (vertical) and scrolling the list is quite slow. There might be an improvement possibility to this overview

hlship 2026-05-08T22:46:49.827409Z

Are you looking at com.repl/rama with its 190 dependencies? Yes, need to come up with something that works when there's so many. Mouse wheel and trackpad scroll works better than clicking one at a time.

hlship 2026-05-08T22:47:48.785119Z

If it's not obvious, those are available today (the docs should call that out better) but it's not obvious what to do to make it better. Cmd-click to scroll a page at a time instead of one at a time?

imre 2026-05-09T12:14:47.954399Z

It wasn't rama repl, it was one of the corporate projects I work on ๐Ÿ™‚ Thanks for the suggestion, I'll try cmd-click next week

hlship 2026-05-09T14:54:36.457739Z

Cmd-click is something I'd have to implement.

Jarrod Taylor (Clojure team) 2026-05-08T19:43:47.132369Z

https://github.com/clojure/core.async.flow-monitor The proc state panel in the monitor is now a collapsible tree instead of a formatted block of text. Proc cards cap their width so a wide state value no longer stretches the card across the page, and in/out port labels show their namespace when present. All changes were the result of user feedback. Thanks to all who have been using flow/flow-monitor and sharing your experiences.

1
5