I think repl driven development with access to native code could be a magic formula for agent engineering. No restarting, no re-compiling. Plus with persistent, immutable data structures you can iterate with many threads in parallel while maintaining sanity.
jwr 9 hours ago [-]
It is. I'm amazed at how quickly agents can work with my Clojure code base and try things out. They make great use of the REPL.
tikotus 9 hours ago [-]
Can it already reliably close parens? I was disappointed some time ago, but sounds like it's ready for a new go...?
throw03172019 3 hours ago [-]
Opus 5.5 has improved a lot on this side. I used to be so frustrated with it breaking the codebase.
Clojure / ClojureScript codebase
jwr 8 hours ago [-]
This was a problem with early models, I would say more than a year ago, and even then, this problem was solved completely by using the clojure-mcp tools for editing.
Today you don't even need to use clojure-mcp for balanced editing. The models do a perfectly fine job.
tikotus 8 hours ago [-]
Thanks! Yeah, it was probably over a year ago that I tried it. Just the thought of a statistical program coding lisp while picking the number of closing parens based on a hunch made me shiver.
embedding-shape 2 hours ago [-]
The trick before was to have really short files, max 50 LOC or so, and they were OK at balancing parens. Nowadays, most SOTA models seem to be able to handle it regardless of LOC in file.
delegate 8 hours ago [-]
I'm amazed by such questions, really.
This was true with gpt-3.5, but things have moved on, dude !
It's like asking 'do movies have sound now?'.
The answer is Yes, not just sound, but also color !
tikotus 2 hours ago [-]
I don't know if it's quite the same. To not have seen movies with sound would have required living under a rock for decades. To not know if the paren problem has been fixed only requires not having tried it for a year, and not being part of any lisp communities.
I'm the first one to admit my ignorance when it comes to LLM capabilities. Hence the honest question.
zikajk 3 hours ago [-]
No, the problem still exists. It just got better.
waffletower 2 hours ago [-]
He shouldn't be downvoted, but I haven't seen broken parens in a while.
Capricorn2481 18 minutes ago [-]
> no restarting, no re-compiling
Is this really a problem with agentic programming? I have done some pretty complex tasks with it and I never thought "this would go a lot faster if the compilation speeds weren't slow." Seems like the time Claude takes dwarfs any build time.
I am not working on 1M+ LOC codebases though, so I could see how slow compilation times could be a problem then, but I imagine the agentic part would also slow down.
mike_ivanov 10 minutes ago [-]
Ask them what they prefer.
s_Hogg 12 hours ago [-]
The first thing that comes to mind with no restarts or recompiling is the mangled variables you get in Jupiter if you're mucking around trying to get a prototype going and forget which cells have been run. I can definitely see agents having a problem with that. I would just try to make compilation fast if possible
kianN 11 hours ago [-]
Immutability and stateless separate the nrepl from jupyter. Clojure is not strictly functional but it tends to be the most straightforward way to do most tasks in the language.
waffletower 1 hours ago [-]
What characterizes a "functional language" often skirts history. Clojure defaults to immutable data structures and is more functional than its Lisp ancestry, although Lisp does enjoy "functional" status in all but the most religious programming circles.
chr15m 10 hours ago [-]
People who are already using LLMs to drive Clojure REPLs say it works well (see #ai-driven-development on the Clojure Slack). I don't think forgetting which cells have been run is a problem with the described set up.
xoxolian 6 hours ago [-]
#ai-assisted-coding actually
chr15m 5 hours ago [-]
Yes, thanks!
pjmlp 9 hours ago [-]
Welcome to the previous AI Summer with Lisp and Prolog environments, :)
Pity that the new Summer got to ride an interpreted language, with bindings to native libraries instead.
onlyrealcuzzo 14 minutes ago [-]
This is quite cool.
```
jank is C++
jank can include any C++ source, link to any C or C++ library, and it uses the C++ type system. jank even compiles to C++!
```
I'd recommend saying that it lowers to C++ earlier, as I imagine most people are interested in that aspect of how it works.
```jank is Clojure on top of C++``` -> `on top of` could mean many things. I'd recommend just saying it transpiles to C++. Then, the pros and cons that come from that flow naturally.
```
Use your favorite nREPL editor plugin. jank contains an LLVM-based JIT runtime to compile C++ code on the fly.
```
This is true for anything written in `jank`, right? But presumably not for your C++ dependencies? Like if you have `jank` code which depends on data managed in a different C++ library.
It would seem there are a lot of concurrency and parallelism implications to this. It would be nice if you spelled that out.
```
jank builds upon Clojure
Keep your existing code; unlock the native world.
```
Are there any limits here? You might want to make that clear if not. Unless explicitly stated, my assumption is that it won't always work (and therefore is mostly irrelevant). Though, in this case, it might actually always work - so that would really be worth a few extra words!
e12e 48 minutes ago [-]
Wonder how this compares to clasp (common lisp c++ impl)?
alper 7 hours ago [-]
Is this like Janet?
delegate 2 hours ago [-]
jank is Clojure, but instead of the JVM it embeds Clang and LLVM, so it can understand C++ headers directly and call C++ with no bindings. Other LLVM languages (Rust, Swift, Zig, etc) are reachable the usual way, through the C ABI.
From the TFA:
Templates, virtual functions, exceptions, overload resolution, and RAII all just work in jank. No boilerplate necessary. Just include your headers and go!
jank can include any C++ source, link to any C or C++ library, and it uses the C++ type system. jank even compiles to C++!
mike_ivanov 10 minutes ago [-]
More like Jolt
fp64 7 hours ago [-]
It's full Clojure, immutable and stuff, with full C++ interop and native compilation. Janet is strongly Clojure influenced but more of an embedded scripting language. I like both quite a bit.
phillc73 6 hours ago [-]
The beautiful thing about Janet is how lightweight and portable it is, no JVM.
I use Janet for all my agentic scripting. Python is forbidden in my harness. Janet scripts for everything. Love it.
worthless-trash 6 hours ago [-]
Please, let me know which AI you have working with janet, I find everything I try to fail horribly, i thinks its clojure.
phillc73 6 hours ago [-]
I use Maki[1] harness and GML-5.3, GLM5.3 Flash and Deepseek-4.1 Flash 1017, with a little bit of MiMo-2.6.
The key I've found is a strong skill. At the beginning, sure there were problems. However, I implemented an AGENTS rule that said if a Janet script failed more than twice on the same "gotcha", the correct syntax was added to the skill. The skill is regularly reviewed, consolidated and pruned. The Janet skill is a floor and loaded at the start of every session.
Edit: Also worth mentioning is that I developed a Janet module with runtime type guards and other helpers to encode the "gotchas". https://github.com/jennystats/janet-kit
Clojure / ClojureScript codebase
Today you don't even need to use clojure-mcp for balanced editing. The models do a perfectly fine job.
This was true with gpt-3.5, but things have moved on, dude !
It's like asking 'do movies have sound now?'. The answer is Yes, not just sound, but also color !
I'm the first one to admit my ignorance when it comes to LLM capabilities. Hence the honest question.
Is this really a problem with agentic programming? I have done some pretty complex tasks with it and I never thought "this would go a lot faster if the compilation speeds weren't slow." Seems like the time Claude takes dwarfs any build time.
I am not working on 1M+ LOC codebases though, so I could see how slow compilation times could be a problem then, but I imagine the agentic part would also slow down.
Pity that the new Summer got to ride an interpreted language, with bindings to native libraries instead.
``` jank is C++ jank can include any C++ source, link to any C or C++ library, and it uses the C++ type system. jank even compiles to C++! ```
I'd recommend saying that it lowers to C++ earlier, as I imagine most people are interested in that aspect of how it works.
```jank is Clojure on top of C++``` -> `on top of` could mean many things. I'd recommend just saying it transpiles to C++. Then, the pros and cons that come from that flow naturally.
``` Use your favorite nREPL editor plugin. jank contains an LLVM-based JIT runtime to compile C++ code on the fly. ```
This is true for anything written in `jank`, right? But presumably not for your C++ dependencies? Like if you have `jank` code which depends on data managed in a different C++ library.
It would seem there are a lot of concurrency and parallelism implications to this. It would be nice if you spelled that out.
``` jank builds upon Clojure Keep your existing code; unlock the native world. ```
Are there any limits here? You might want to make that clear if not. Unless explicitly stated, my assumption is that it won't always work (and therefore is mostly irrelevant). Though, in this case, it might actually always work - so that would really be worth a few extra words!
From the TFA:
Templates, virtual functions, exceptions, overload resolution, and RAII all just work in jank. No boilerplate necessary. Just include your headers and go! jank can include any C++ source, link to any C or C++ library, and it uses the C++ type system. jank even compiles to C++!
I use Janet for all my agentic scripting. Python is forbidden in my harness. Janet scripts for everything. Love it.
The key I've found is a strong skill. At the beginning, sure there were problems. However, I implemented an AGENTS rule that said if a Janet script failed more than twice on the same "gotcha", the correct syntax was added to the skill. The skill is regularly reviewed, consolidated and pruned. The Janet skill is a floor and loaded at the start of every session.
Edit: Also worth mentioning is that I developed a Janet module with runtime type guards and other helpers to encode the "gotchas". https://github.com/jennystats/janet-kit
[1] https://maki.sh