Gloat is a Glojure AOT automation tool.
I worked with James Hamlin to get Glojure AOT going last summer and have been moving it forward since. I've also been working with marcingas (nooga) to get Gloat/Glojure/let-go all cooperating.
As far as JVM-free Clojure-like, Janet is really nice. I've been using it in production for a while: https://janet-lang.org/ There's also Fennel if you want the Lua vm and libraries.
marcingas 2 days ago [-]
Thanks! Joe looks good! As for Janet - never tried it myself but I always thought it's doing its own thing instead of trying to be Clojure.
TJSomething 2 days ago [-]
While Janet pulls from a few inspirations, the syntax is pure Clojure. I always figured that it was trying fix up the bumpy parts in Fennel to enable a programming style that was more consistently Clojure-like and functional than could be done in Fennel, since Fennel ultimately has to use Lua's semantics because Fennel compiles to Lua.
veqq 1 days ago [-]
It's a bit harder as Fennel can produce pure functions, whereas basically everything in Janet's standard library outputs mutable structures etc. Janet style tends towards (elegant) imperative programming.
2 days ago [-]
fuzztester 1 days ago [-]
For what types of work do you Janet in production?
boguscoder 2 days ago [-]
Micro nit: it says 7ms cold start and then 6ms just few lines lower.. maybe it gets faster as you read README
marcingas 2 days ago [-]
Fixed, thanks! It's 6-7ms on my machine. Median seems to be around 6.5ms :)
bjconlan 3 days ago [-]
This is the kind of clojure port that I always was looking for. Mostly because I thought go's core library and channels abstractions hits a simpler/nicer base API which would with the core & async apis (not to mention scratches my big beautiful binary itch)
Thanks for your work will definitely check it out again once I get over renewed love for cpp (26)
Edit how did glojure go under my radar also a great project from the looks
giancarlostoro 3 days ago [-]
I have played with the idea of making a “old school PHP” style DSL that takes advantage of the Go runtime and packages under the cover. I say old school PHP because PHP used to be a web focused DSL its no longer the case, I feel like it would make for an interesting easy to use backend language similar to PHP but with the full power of Go behind it. Clojure is an excellent choice.
marcingas 3 days ago [-]
Thanks for kind words! Please don't forget to drop me an issue or two when you eventually get to it :)
phplovesong 2 days ago [-]
There seems to be a surge in compile to Go projects recently. To me this signals that the runtime / stdlib of Go is one of the best out there (when going the GD'd route), but the surface level (syntax) is too simple/verbose and lacks the expressiveness developers want.
So far Lisette (http://lisette.run) seems to be the best/most active version of a compile to Go language out there.
christophilus 2 days ago [-]
That does look pretty good. I don’t love the mixing of PascalCase / camelCase and snake_case, though.
phplovesong 2 days ago [-]
Thats just a pragmatic design decision for Go interop, as Go went nuts with public being UpperCase.
Theres no camelCase tho? Snake case and PascalCase fir Go modules interrop.
I think it is brilliant and completely underappreciated :)
marcingas 2 days ago [-]
What I appreciate about Joker is how smoothly it wraps Go libs. It seems that they have covered everything that Go has to offer.
I'm trying to avoid adding too much though, I like that let-go fits in 10MB :)
didibus 2 days ago [-]
Cool, I think at this point, since there's a few Clojure Go dialect, what I'd like to understand most is which one is fully hosted on Go, has as good interop as JVM Clojure has with Java, where I can both use what I make from Go, and also use Go from Clojure, and even create mixed projects would be nice. And also, truly details the differences, beyond interrop, what is not the same and differs.
marcingas 2 days ago [-]
I think Gloat/Glojure has the best hosted runtime story because of its AOT to Go src pipeline - you can grab anything Go at compile time. OTOH let-go can roundtrip any Go value including structs, functions and channels but it does not allow pulling arbitrary go libs without wrapping them up first - they'd need to be built into the runtime for this.
dharmatech 2 days ago [-]
Amazing that it can run in plan9!
It would be awesome if go was a first class language on 9front. I.e. ships with it.
I've been messing around with a social network for plan9:
It's all in rc and awk.
There are places where go (or clojure!) would have been nice.
marcingas 2 days ago [-]
Love the demo for 9social! I'm not a user myself but I'm always inspired by the Plan 9 ways :)
dharmatech 2 days ago [-]
Thanks for checking it out!
marcingas 2 days ago [-]
I started publishing amd64 and arm (32) binaries for Plan 9 in GH releases. I tested the amd64 one on 9front and everything seems to work. The CLI is not very Plan9-y but I'm happy to make the port more native at some point :)
dharmatech 2 days ago [-]
Ah, awesome!
I'll head over to the releases.
dmitrygr 3 days ago [-]
You should see how fast libc gets mmaped() into the VM and the first instr runs :)
marcingas 3 days ago [-]
Sure, I should clarify: The 7ms here is measured at the point where let-go starts executing user code. It takes 7ms to initialize the compiler, load all stdlib namespaces and compute all vars. So it's not "time to first instruction", it's "time to running your code".
Yes, I know about this one. I'm even comparing against it in my benchmarks :)
rcarmo 2 days ago [-]
You need to update the go-joker numbers, I removed the GIL yesterday or so and did some changes to the IR. ;)
marcingas 2 days ago [-]
I think I've pulled the latest today but will double-check and update them again tomorrow. I'm still puzzled why it doesn't run the tak function. Btw. Have you tried running my benches? I'm very curious about your results!
rcarmo 1 days ago [-]
I got tak fixed. There was an internal logic error, IIRC. A bunch of stuff got done.
marcingas 2 days ago [-]
Updated. Looks like my VM gets a beating from wazero but that's kind of expected :D
I wish this had a better language name than just "lets-go". How about "clogo" ?
marcingas 2 days ago [-]
Naming is hard but I like let-go, it's a layered pun :)
(let [...] (go ...))
It lets you let in Go!
Clogo is a no-go for me. Maybe you have some other ideas? I'll consider good ones :)
dxdm 2 days ago [-]
FWIW I like let-go a lot as the name.
I'm relieved that clogo is not an option for you. It has some strong, malodorous campground toilet connotations to my foreign-language-trained ears. Loogo? Pottygo? Go number 2? Yikes to all of those.
Changing name to Gojure now would only add to the confusion :D
faangguyindia 2 days ago [-]
I am finding i need "Rails" but i like single binary deployment of Go and fast/low resource usage like Go.
Is it possible for now?
marcingas 2 days ago [-]
I think you could make a framework on top of this. It doesn't yet run unmodified Clojure libs like hiccup but it wouldn't be hard to roll something relatively simple and solid in let-go. IMO
achenet 2 days ago [-]
This is beautiful, makes me wish I'd made it.
Excellent work, thank you for sharing it with us ^_^
marcingas 2 days ago [-]
Thank you! If you ever want to contribute PRs and issues are warmly welcomed :)
cutler 2 days ago [-]
Joker, Janet, Glojure and now Let-go. Am I missing something?
The JVM can boot up in microseconds you just have to tune it a bit.
marcingas 2 days ago [-]
The JVM itself - yes, but then you need to wait for Clojure itself. Clojure is famously slow because it interns a bunch of stuff and computes var references every time it boots. I never intended for let-go to be a race car but small distro, low memory usage and snappy start are its priorities at the moment.
immanuwell 2 days ago [-]
jvm clojure's startup tax is exactly why it never cracked the serverless/cli niche, and this pure-go implementation is the kind of unhinged side project, good luck
marcingas 2 days ago [-]
Thanks! I've been looking into custom runtimes for AWS Lambda and I think it's not going to be hard to have let-go lambdas. Even though the language is not 100% compatible it should be enough for request handlers and data processing. Throughput isn't on par with JITed impls but it's not bad enough to be impractical IMO
2 days ago [-]
j3s 2 days ago [-]
absolutely sick of reading through obviously AI-slopped READMEs. it's your project, take a little pride and tell me why i should like it quickly instead of asking your agent to rattle off a list of features -- it's severely boring & offputting.
You can also refer to the HN post itself - it says why I think it's cool.
jimbokun 2 days ago [-]
This version is infinitely better.
j3s 2 days ago [-]
apologies if i was blunt - readme sloppage is a particular annoyance of mine that is quickly becoming common. i'm not against vibecoding, far from it. but a readme is a part of a project that humans immediately touch - seeing it littered with em-dashes signals carelessness.
i appreciate you taking my feedback with grace.
rcarmo 2 days ago [-]
I would like to point out, again, that em dashes are very much used by humans that run macOS or iOS — like in this case.
isityettime 2 days ago [-]
Also Linux, where it's easy to configure a compose key to mnemonically type all the Unicode goodies you can think of.
Android's software keyboards generally make it easy, too.
marcingas 2 days ago [-]
No worries at all. I understand your point. I'll look into fixing this!
stingraycharles 2 days ago [-]
Why did you feel the need to slopify your README? The original version read much, much better.
I genuinely don’t understand why people do this.
marcingas 2 days ago [-]
Good question, perhaps I really was just careless. I'll look into fixing the README.
stingraycharles 2 days ago [-]
It’s all good. Your project is awesome (and I say this as someone who has done Clojure fulltime for 5 years and nowadays write mostly Go).
uxcolumbo 2 days ago [-]
What made you stop using Clojure? Lack of Clojure jobs? Or something else?
stingraycharles 2 days ago [-]
Job offer I couldn’t refuse that didn’t have Clojure.
Now I work for a fully remote team, can work anywhere in the world, at any moment I want, leading the data / cloud team for a distributed timeseries database.
Can’t complain. :)
Clojure has had a huge, fundamental impact on my way of approaching software development. I actually came from a Haskell / C++ background, but the way Clojure treats data still has a fundamental impact on how I reason about data, architecture and simplicity.
I did have some issues with how Clojure is managed and do not always subscribe to Rich’s vision (I think core.spec makes no sense, a heavily macro based global state registry is fundamentally not how I would design this, and malli is infinitely better. same for core.async vs manifold), but that is a minor detail in what was a transformative experience for me.
I believe I am not alone when I say this.
I’m still following things from a distance. Considering the current thread, I’m actually very interested in yank, which is Clojure on LLVM, and have been sponsoring that project for a few years. That would be very nice if it could enter stable state, I may take another look again.
uxcolumbo 2 days ago [-]
Thanks for clarifying.
> I did have some issues with how Clojure is managed
Yes there was some drama a few years back and then Rich wrote his post 'Opensource is not about you'. It was a good post.
Opensource is not easy and you might argue the reason why Clojure is so stable and backwards compatible is because of the way it's managed.
Luckily we didn't end up with a scenario where Rich completely stopped. I think there was a recent case of an opensource maintainer (who works in academia) stopping PRs due to an entitled user. Can't remember the project.
But equally, is the current form of stewardship fit for purpose for the next 10 years of Clojure, i.e. to increase adoption by businesses? Don't know. Maybe something can be learned from how Linux is managed. I think Linus experienced similar bottleneck issues back then.
I've never heard of manifold before and I'm curious what you prefer about it to core.async.
I've read through their website and README but I feel like I'm missing what separates it from other async libraries.
Can you explain a few examples where it shines compared to core.async?
3 days ago [-]
ever_same_4 2 days ago [-]
[dead]
jeremyjh 2 days ago [-]
How do you explain how more than half of that work was done in 2021? Or did you not look at the repo either? Even in 2023 AI could not really vibe code much of anything. Tell me about the AI coding tools available in 2021 though. It was all done with autocomplete?
created: 7 hours ago
I’m sure you have some impressive work from that era to share here as well.
hope2 14 hours ago [-]
[dead]
ever_same_4 2 days ago [-]
[dead]
sagar6164 2 days ago [-]
[dead]
3 days ago [-]
asdasd44123123 2 days ago [-]
[flagged]
asdasd44123123 2 days ago [-]
[flagged]
asdfasd323f 2 days ago [-]
[flagged]
asdfasd323f 2 days ago [-]
[flagged]
asdfasd323f 3 days ago [-]
[flagged]
marcingas 3 days ago [-]
Yes, I have used AI to boost Clojure compat and fill out some blanks but the runtime itself is not vibecoded. I wrote it myself between Jan 2021 and July 2023. All commits on GH.
jeremyjh 2 days ago [-]
Did you even look at the repo history? Clearly it blasted off this year that way but that isn't how it started. Probably he got way more into it once he could make faster progress on all the yak shaving required to make it more useful.
marcingas 2 days ago [-]
Yeah, pretty much. I abandoned it in 2023 due to lack of time. At this point it had enough lift for solving AoC problems and writing small scripts. I've recently dusted it off and did the boring parts of the "roadmap" with Claude.
adi_kurian 2 days ago [-]
Is it bad? Did you try it?
bpicolo 2 days ago [-]
As much as we may all hate to admit it, vibecoding is very close to just being the new programming.
blanched 2 days ago [-]
You made an account just to post this low effort “criticism”? What’s the point?
asdfasd323f 2 days ago [-]
I did. And it looks like you did too. Which is why you answered your own question in the second half of your comment, quite amusingly. "Probably" LOL!
Macros with syntax quote,
Reader conditionals,
Destructuring,
Multi-arity functions,
Atoms, channels & go-blocks a'la core.async,
Regular expressions (the Go flavor),
Simple json, http and os namespaces,
Many functions ported from clojure.core,
REPL with syntax-highlighting and completions,
Simple nREPL server that seems to work with BetterThanTomorrow/calva,
asdasd44123123 2 days ago [-]
[flagged]
ever_same_4 2 days ago [-]
[flagged]
jeremyjh 2 days ago [-]
Its ok that you have no knowledge or skill of software development. You don't have to keep creating new accounts to troll people with. Why not just go post on X?
aosidj12 2 days ago [-]
[dead]
hope2 2 days ago [-]
Its ok that you have no knowledge or skill of software development either. That much is obvious.
asdfasd323f 2 days ago [-]
The readme clearly has abundant emdashes and emojis everywhere, the code itself is obviously vibed. Not really sure what you're objecting to, to be honest.
marcingas 2 days ago [-]
Yeah, it has em dashes alright. But the emojis you're referring to were committed in January 2023 (0c4925c). But that's besides the point I guess. What is your point?
asdfasd323f 2 days ago [-]
[flagged]
1 days ago [-]
Rendered at 11:32:32 GMT+0000 (Coordinated Universal Time) with Vercel.
Gloat is a Glojure AOT automation tool. I worked with James Hamlin to get Glojure AOT going last summer and have been moving it forward since. I've also been working with marcingas (nooga) to get Gloat/Glojure/let-go all cooperating.
As far as JVM-free Clojure-like, Janet is really nice. I've been using it in production for a while: https://janet-lang.org/ There's also Fennel if you want the Lua vm and libraries.
Thanks for your work will definitely check it out again once I get over renewed love for cpp (26)
Edit how did glojure go under my radar also a great project from the looks
So far Lisette (http://lisette.run) seems to be the best/most active version of a compile to Go language out there.
Theres no camelCase tho? Snake case and PascalCase fir Go modules interrop.
That’s Pascal case any way. Looks sort of camel case with the “io” being lower case.
Ofc you can write your own wrapper, but so far i have not bothered.
I think it is brilliant and completely underappreciated :)
I'm trying to avoid adding too much though, I like that let-go fits in 10MB :)
It would be awesome if go was a first class language on 9front. I.e. ships with it.
I've been messing around with a social network for plan9:
https://youtube.com/watch?v=q6qVnlCjcAI&si=MBCeM0QdA0WsKAe7
It's all in rc and awk. There are places where go (or clojure!) would have been nice.
I'll head over to the releases.
https://github.com/glojurelang/glojure
(let [...] (go ...))
It lets you let in Go!
Clogo is a no-go for me. Maybe you have some other ideas? I'll consider good ones :)
I'm relieved that clogo is not an option for you. It has some strong, malodorous campground toilet connotations to my foreign-language-trained ears. Loogo? Pottygo? Go number 2? Yikes to all of those.
And now, as bonus content, for something completely different: https://youtu.be/M3-51DhOzHE?
Goclo, Gophoj,Gorjure ..ok my tongue is paining now verbally trying out combos.
Is it possible for now?
Excellent work, thank you for sharing it with us ^_^
You can also refer to the HN post itself - it says why I think it's cool.
i appreciate you taking my feedback with grace.
Android's software keyboards generally make it easy, too.
I genuinely don’t understand why people do this.
Now I work for a fully remote team, can work anywhere in the world, at any moment I want, leading the data / cloud team for a distributed timeseries database.
Can’t complain. :)
Clojure has had a huge, fundamental impact on my way of approaching software development. I actually came from a Haskell / C++ background, but the way Clojure treats data still has a fundamental impact on how I reason about data, architecture and simplicity.
I did have some issues with how Clojure is managed and do not always subscribe to Rich’s vision (I think core.spec makes no sense, a heavily macro based global state registry is fundamentally not how I would design this, and malli is infinitely better. same for core.async vs manifold), but that is a minor detail in what was a transformative experience for me.
I believe I am not alone when I say this.
I’m still following things from a distance. Considering the current thread, I’m actually very interested in yank, which is Clojure on LLVM, and have been sponsoring that project for a few years. That would be very nice if it could enter stable state, I may take another look again.
> I did have some issues with how Clojure is managed
Yes there was some drama a few years back and then Rich wrote his post 'Opensource is not about you'. It was a good post.
Opensource is not easy and you might argue the reason why Clojure is so stable and backwards compatible is because of the way it's managed.
Luckily we didn't end up with a scenario where Rich completely stopped. I think there was a recent case of an opensource maintainer (who works in academia) stopping PRs due to an entitled user. Can't remember the project.
But equally, is the current form of stewardship fit for purpose for the next 10 years of Clojure, i.e. to increase adoption by businesses? Don't know. Maybe something can be learned from how Linux is managed. I think Linus experienced similar bottleneck issues back then.
> I’m actually very interested in yank
I think you mean Jank: https://jank-lang.org/ ?
I'm quite excited about Clojure for GO projects.
EDIT: clarity.
I've read through their website and README but I feel like I'm missing what separates it from other async libraries.
Can you explain a few examples where it shines compared to core.async?
created: 7 hours ago
I’m sure you have some impressive work from that era to share here as well.
https://github.com/nooga/let-go/tree/d9dc094822b2983ebf44604...
In 2023 he had a working Clojure compiler with:
Macros with syntax quote, Reader conditionals, Destructuring, Multi-arity functions, Atoms, channels & go-blocks a'la core.async, Regular expressions (the Go flavor), Simple json, http and os namespaces, Many functions ported from clojure.core, REPL with syntax-highlighting and completions, Simple nREPL server that seems to work with BetterThanTomorrow/calva,