calcit
calcit copied to clipboard
Indentation-based ClojureScript compiling to JavaScript ES Modules
Calcit Scripting Language
Semantically a dialect of ClojureScript. Built with Rust. Compiles to JavaScript ES Modules.
- Home http://calcit-lang.org/
- API Doc http://apis.calcit-lang.org/
- Guidebook http://guide.calcit-lang.org/
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:
# get Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# get Calcit
cargo install calcit
For Ubuntu latest, try binaries from http://bin.calcit-lang.org/linux/ , which are provided for CI usages.
Usage
Snippets evaling:
cr -e 'range 100'
multi-lines snippet:
cr -e '
println "|a demo"
->
range 100
map $ fn (x)
* x x
'
Run with a compact.cirru:
cr compact.cirru -1 # run only once
cr compact.cirru # watch mode enabled by default
cr compact.cirru --init-fn='app.main/main!' # specifying init-fn
JavaScript codegen
It compiles to JavaScript and runs in consistet semantics. However it might require a lot of JavaScript interop.
cr compact.cirru --emit-js # compile to js
cr compact.cirru --emit-js --emit-path=out/ # compile to js and save in `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
No package manager yet, need to manage modules with git tags.
Configurations inside 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.
To load modules in CI environments, make use of git clone
.
Development
I use these commands to run local examples:
# run tests in Rust
cargo run --bin cr -- calcit/test.cirru -1
# run tests in Node.js
cargo run --bin cr -- calcit/test.cirru --emit-js -1 && yarn try-js
# run snippet
cargo run --bin cr -- -e 'range 100'
cr compact.cirru --emit-ir # compiles intermediate representation into program-ir.cirru
- Cirru Parser for indentation-based syntax parsing.
-
Cirru EDN for
compact.cirru
file 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 Logs https://github.com/calcit-lang/calcit/discussions
- 视频记录 https://space.bilibili.com/14227306/channel/seriesdetail?sid=281171
License
MIT