ClojureScript Research Notes
Table of Contents
1. Overview
Research notes covering ClojureScript from the "Embracing JavaScript Tools" era (1.10.x) through the current 1.12.x async/await releases, and their implications for the Clojure Brain Teasers Review project.
2. Release Timeline
| Version | Date | Theme / Notes | File |
|---|---|---|---|
| 1.12.145 | 2026-05-07 | ^:async / await | release-1.12.145.org |
| 1.12.134 | |||
| 1.12.116 | 2025-11-24 | ES2016, Proxy, Lite Mode | release-1.12.116.org |
| 1.12.42 | |||
| 1.11.132 | |||
| 1.11.51 | |||
| 1.10.914 | |||
| 1.10.891 | |||
| 1.10.866 | |||
| 1.10.844 | Embracing JavaScript Tools |
3. Brain Teaser Candidates
3.1. Async/Await (1.12.145)
Detailed analysis: async-brain-teasers.org – 9 candidates, 4 implemented.
Top picks:
- Serial vs parallel await in
let(T1) awaitis not a function (T3)- Async test that passes by accident (T4)
bindinglost across await (T5)
3.2. Proxy & Interop (1.12.116)
See release-1.12.116.org for candidates around:
- Proxied map mutation transparency
refer-globalshadowing- Lite mode type identity
- Method values with variadic functions
4. Key Themes
4.1. JS Interop Friction Reduction
Each release reduces the gap: npm deps -> proxy -> refer-global -> async/await.
4.2. Compilation Target Evolution
ES3 (1999) -> ES2016 (2016) in 1.12.116. Unlocks Proxy, Reflect, async functions.
4.3. Async Model Differences
JVM Clojure: threads + STM + core.async. ClojureScript: single-threaded event loop + promises + ^:async/await. Same code patterns (binding, atoms, lazy seqs) have different failure modes.
5. Diagram Ideas
- ClojureScript release timeline with key features per version
- Async frame lifecycle:
letdesugaring creates sequential awaits - Promise.all vs serial await timing comparison
- Dynamic binding stack vs async frame suspension
- JS interop evolution across releases
