- Notifications
You must be signed in to change notification settings - Fork2
Indentation-based ClojureScript dialect in Rust and compiling to JavaScript ES Modules
calcit-lang/calcit
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Semantically a dialect of ClojureScript. Built with Rust. Compiles to JavaScript ES Modules.
- Homehttps://calcit-lang.org/
- API Dochttps://apis.calcit-lang.org/
- Guidebookhttps://guide.calcit-lang.org/
Browse examples or alsotry WASM version online.
Core design:
- Interpreter runs on Rust, extensible with Rust FFI
- Persistent Data Structure
- Structural Editor(with indentation-based syntax as a fallback)
- Lisp macros, functional style
- Compiles to JavaScript in ES Modules, JavaScript Interop
- Hot code swapping friendly
Build and install with Rust:
# get Rustcurl --proto'=https' --tlsv1.2 -sSf https://sh.rustup.rs| sh# get Calcitcargo install calcit
3 binaries are installed:
calcit, the runtime and js compilercaps, for downloading dependencies declared indeps.cirrubundle_calcit, bundle code if you don't want to use Calcit Editor
To use Calcit in GitHub Actions, trysetup-cr.
Snippets evaluating:
creval'range 100'creval'thread-first 100 range (map $ \ * % %)'
Run with acompact.cirru:
cr compact.cirru -1# run only oncecr -1# by default, it picks `compact.cirru`cr# watch mode enabled by default
By default Calcit reads:init-fn and:reload-fn insidecompact.cirru configs. You may also specify functions,
cr --init-fn='app.main/main!' --reload-fn='app.main/reload!'
and even configure:entries incompact.cirru:
cr --entry server
It compiles to JavaScript and runs in consistet semantics. However it might require a lot of JavaScript interop.
cr js# compile to js, also picks `compact.cirru` by defaultcr js --emit-path=out/# compile to js and save in `out/`
By default, js code is generated tojs-out/. You will need Vite or Node to run it, from an entry file:
import{main_$x_,reload_$x_}from"./js-out/app.main.mjs";main_$x_();// which corresponds to `main!` function in calcit
InstallCalcit Editor and runct to launch editor server,which writescompact.cirru and.compact-inc.cirru on saving. Try launching example by cloningCalcit Workflow.
Read more inMinimal Calcit to learn how to code Calcit with a plain text editor.
Read more inRespo Calcit Workflow to learn to create an MVC webpage withRespo.
Calcit provides MCP server functionality for integration with AI assistants and development tools. The MCP server offers tools for:
- Code Management: Read, write, and modify Calcit namespaces and definitions
- Project Operations: Manage modules, dependencies, and configurations
- Calcit Runner: Start/stop background runner processes with incremental updates
- Documentation: Query API docs, reference materials, and dependency documentation
When using the Calcit Runner through MCP:
Start Runner: Use
start_calcit_runnerto launch the background process. This automatically:- Creates a
.calcit-tmp/directory - Copies the current
compact.cirruas a temporary baseline
- Creates a
Generate Incremental Updates: After making changes to your code, use
generate_calcit_incrementalto:- Compare current
compact.cirruwith the temporary baseline - Generate a
.compact-inc.cirrufile with only the changes - Apply incremental updates to the running process
- Compare current
Check Results: After generating the incremental file, always check the runner logs using
grab_calcit_runner_logsto verify that updates were applied successfully.
This workflow enables efficient hot-reloading during development without restarting the entire application.
deps.cirru declares dependencies that need to download, which correspond to repositories on GitHub. Specify a branch or a tag:
{} :calcit-version|0.9.11 :dependencies${} |calcit-lang/memof|0.0.11 |calcit-lang/lilac|main
Runcaps to download. Sources are downloaded into~/.config/calcit/modules/. If a module containsbuild.sh, it will be executed mostly for compiling Rust dylibs.
:calcit-version helps in check version, and provides hints inCI environment.
To load modules, use:modules configuration andcompact.cirru(which normally generated fromcalcit.cirru):
:configs${} :modules$[]|memof/compact.cirru|lilac/
Paths defined in:modules field are just loaded as files from~/.config/calcit/modules/,i.e.~/.config/calcit/modules/memof/compact.cirru.
Modules that ends with/s are automatically suffixedcompact.cirru since it's the default entry.
I use these commands to run local examples:
# run tests in Rustcargo run --bin cr -- calcit/test.cirru -1# run tests in Node.jscargo run --bin cr -- calcit/test.cirru -1 js&& yarn try-js# run snippetcargo run --bin cr --eval'range 100'cr compact.cirru -1 ir# compiles intermediate representation into program-ir.cirru
- Cirru Parser for indentation-based syntax parsing.
- Cirru EDN for
compact.cirrufile parsing. - Ternary Tree for immutable list data structure.
Other tools:
- Error Viewer for displaying
.calcit-error.cirru - IR Viewer for rendering
program-ir.cirru
Some resources:
- Dev Logshttps://github.com/calcit-lang/calcit/discussions
- 视频记录https://space.bilibili.com/14227306/channel/seriesdetail?sid=281171
MIT
About
Indentation-based ClojureScript dialect in Rust and compiling to JavaScript ES Modules
Topics
Resources
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.
Contributors8
Uh oh!
There was an error while loading.Please reload this page.