announcements 2026-05-08

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

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

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

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

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

not public yet

just lives between me and Claude

๐Ÿ‘ 1

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

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

๐Ÿ‘ 1

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

@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

ok, that makes sense

I also like the dump simplicity of C, hehe

๐Ÿ˜„ 1

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

Clojure with bit of SBCL soul

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).

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

1

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

๐Ÿ˜… 1

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

๐Ÿ‘ 1

@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!

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

what's your value representation?

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.

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

teehee

๐Ÿ”ฅ 1
๐ŸŽ‰ 1

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

๐Ÿ’ก 1

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

๐Ÿ‘ 1

seems to work with recur and TCO too

but it's cursed and experimental

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

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

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

but anything lower than that is going to be very hard

@leif.eric.fredheim what did you do?

๐Ÿ‘ 1

@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

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

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

yesh fused opcodes are OP

โšก 1

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

๐Ÿ’ก 1

JS is orders of magnitude more complex than clojure

๐Ÿ’ฏ 2

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

๐Ÿ™‡โ€โ™‚๏ธ 2

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

๐Ÿ™ 1

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

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

Borrowing the things that Lua got right.

Yeah, mino passes that.

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

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.

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

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

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.

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

I'll add it to my bench comparison

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

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

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

๐Ÿ™Œ 1

@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/

I'd say perf is less important than completeness

๐Ÿ’ฏ 1

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

๐Ÿค” 1

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

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

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

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

๐Ÿ‘ 1
2

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

๐Ÿ‘€ 1

yeah, meta tracing

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

๐Ÿ’ก 1

@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

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.

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

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

yeah, that makes sense

also, this is for embedding in games, right?

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

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

Basically any situation where one might use Lua.

not that I don't support this decision wholeheartedly!

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

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

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

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

๐Ÿ‘ 1

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

are you producing static binaries?

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

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

10MB is still quite small, though!

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

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

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

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

BEAMy clojure could be very fun

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

@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

how many assertions total?

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.

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

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

4696 / 4921 assertions, 217 files ๐Ÿค”

one of us must be counting the assertions wrong

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

or mine is bugged ๐Ÿ˜„

๐Ÿ˜‚ 1

I'll look into this

that was before I stopped double counting ๐Ÿ˜„

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

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.

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

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

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

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

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

๐Ÿ’ฏ 1

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.

If I want to keep mino small for embedding.

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

forget tracing ๐Ÿ˜„

LuaJIT is about 30KLOC (also C).

yeah, it will bloat

๐Ÿ’ฏ 1

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

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

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

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

๐Ÿ˜… 1

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

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

But even that will be difficult.

go incremental, bytecode VM should get you in babashka ballpark

๐Ÿ‘ 1

@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).

wow, great progress, no notes

๐Ÿ‘ 1

also, comes along really really fast ๐Ÿ˜„

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

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

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

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.

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.

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

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

Sameโ€ฆ

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

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

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

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

1

Ah, I thought this was DM! Haha

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

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

๐Ÿ’ฏ 1

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

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

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

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

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

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

#ai-assisted-coding

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

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

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.

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

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

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

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

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.

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

๐Ÿ‘ 1

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

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

let's hope for that ๐Ÿ˜„

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

๐Ÿ’ฏ 1

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?

well they are useful ๐Ÿ˜„

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

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.

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

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

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.

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

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

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

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

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

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.

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.

But the standalone binary ships with everything included by default.

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.

@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

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).

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

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

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.

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.

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

There is also LuaJIT.

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.

Very cool! Not sure how I missed this

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

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.

Something akin to Hy for Mojo could be cool as well

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.

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

Leaving https://clojurians.slack.com/archives/C0ASAQ9QD71/p1789469770916739 here for posterity, in case someone stumbles into this thread.

hey man, thanks for this info! still curious whats your current stance on AI ethics

I don't really know, to be honest. I don't feel like I have enough information to have a strong stance. But it all seems ethically murky at best. The strongest objection from me right now is how it sucks the time and attention from a lot of skilled people, and also the consumption of money, materials and electricity to create "AI" infrastructure, that could have been spent on other things. I recently went to JavaZone, which is a really good technical conference in Oslo, where I live. Most of the talks were about "AI" in one way or another, and it dawned on me how tired/fatigued I am by hearing about it every day all day, when there are so many other interesting things to talk about.

So I guess it's more a case of erring on the side of safety when faced with a lot of unknowns and some probable big risks.

๐Ÿ‘ 2

There are some things, like copyright/IP, that I honestly care less about. Sharing all my data with Anthropic and OpenAI is something I've become more skeptical about.

Another thing I've noticed and been thinking about a lot lately, is how lazy and complacent I become when using LLMs to generate code. I've always valued learning and practicing skills, and I feel like my knowledge and skills have started rotting. I still think LLMs are useful for certain things (I wrote about that https://lnkd.in/p/eTXVpHVK). But I want to find a way to use LLMs in a way that does not take away from my learning and skill-honing, preferably using the using the CPU/GPU I already have in my laptop.

๐Ÿ‘ 1

I think https://vimeo.com/1223705758 articulates the situation quite well and in more depth.

๐Ÿ‘ 1

good talk, nice overview of AI realities, I kinda think ending lacked a proper punchline, but yeah. there was some thinking done here, I like it

๐Ÿ‘ 1

and I immensely agree with part about idiotic questions

๐Ÿ’ฏ 1

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

found it useful immediately, thank you!

Music to my ears!

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

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.

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?

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

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