Calcit Scripting Language
Semantically a dialect of ClojureScript. Built with Rust. Compiles to JavaScript ES Modules.
Browse examples or also try 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
Install
Build and install with Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install calcit
3 binaries are installed:
calcit
, the runtime and js compilercaps
, for downloading dependencies declared in deps.cirru
bundle_calcit
, bundle code if you don't want to use Calcit Editor
To use Calcit in GitHub Actions, try setup-cr.
Usage
Snippets evaling:
cr eval 'range 100'
multi-lines snippet:
cr eval '
println "|a demo"
->
range 100
map $ fn (x)
* x x
'
Run with a compact.cirru:
cr compact.cirru -1
cr compact.cirru
By default Calcit reads :init-fn
and :reload-fn
inside compact.cirru
configs. You may also specify functions,
cr compact.cirru --init-fn='app.main/main!' --reload-fn='app.main/reload!'
and even configure :entries
in compact.cirru
:
cr compact.cirru --entry server
JavaScript codegen
It compiles to JavaScript and runs in consistet semantics. However it might require a lot of JavaScript interop.
cr compact.cirru js
cr compact.cirru js --emit-path=out/
By default, js code is generated to js-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_();
Calcit Editor & Bundler
Install Calcit Editor and run ct
to launch editor server,
which writes compact.cirru
and .compact-inc.cirru
on saving. Try launching example by cloning Calcit Workflow.
Read more in Minimal Calcit to learn how to code Calcit with a plain text editor.
Read more in Respo Calcit Workflow to learn to create an MVC webpage with Respo.
Modules
deps.cirru
declares dependencies that need to download, which correspond to repositories on GitHub. Specify a branch or a tag:
{}
:dependencies $ {}
|calcit-lang/memof |0.0.11
|calcit-lang/lilac |main
Run caps
to download. Sources are downloaded into ~/.config/calcit/modules/
. If a module contains build.sh
, it will be executed mostly for compiling Rust dylibs.
To load modules, use :modules
configuration in calcit.cirru
and compact.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 suffixed compact.cirru
since it's the default filename.
Development
I use these commands to run local examples:
cargo run --bin cr -- calcit/test.cirru -1
cargo run --bin cr -- calcit/test.cirru -1 js && yarn try-js
cargo run --bin cr -- eval 'range 100'
cr compact.cirru -1 ir
Other tools:
Some resources:
License
MIT