tricu
Introduction
tricu (pronounced "tree-shoe") is an experimental programming language written in Haskell. It is fundamentally based on the application of Triage Calculus, an extended form of Tree Calculus. I refer to this "family" of calculi as TC below.
tricu is the word for "tree" in Lojban: (x1) is a tree of species/cultivar (x2).
In the ext/ directory there are implementations of TC evaluators and tooling in other languages. Here be dragons; beware.
While my original implementation was hand-written, I have since fully embraced the slopmachine for this project. Nothing is stable or sacred. We will discover sanity at the end of the journey but we won't strive for it until then. The main branch will see my latest thoughts and experiments. Emphasis on "AUTHOR DISCLAIMS ALL WARRANTIES" from the LICENSE.
This README.md is 100% human written. No other .md file will be until stabilization.
Acknowledgements
Tree Calculus was discovered by Barry Jay. The addition of Triage rules were suggested by Johannes Bader. Johannes is also the creator of treecalcul.us which has a great intuitive code playground using his language LambAda.
REPL examples
tricu < -- Anything after `--` on a single line is a comment
tricu < id = (a : a) -- Lambda abstraction is eliminated to tree calculus terms
tricu < head (map (i : append i " world!") [("Hello, ")])
tricu > "Hello, world!"
tricu < id (head (map (i : append i " world!") [("Hello, ")]))
tricu > "Hello, world!"
tricu < -- Intensionality! We can inspect the structure of a function or data.
tricu < triage = (a b c : t (t a b) c)
tricu < test = triage "Leaf" (z : "Stem") (a b : "Fork")
tricu < test (t t)
tricu > "Stem"
tricu < -- We can even convert a term back to source code (/demos/toSource.tri)
tricu < toSource not?
tricu > "(t (t (t t) (t t t)) (t t (t t t)))"
tricu < -- or calculate its size (/demos/size.tri)
tricu < size not?
tricu > 12
Installation and Use
You can easily build and run this project using Nix.
- Quick Start (REPL):
nix run git+https://git.eversole.co/James/tricu
- Build executable in
./result/bin:nix build git+https://git.eversole.co/James/tricu
./result/bin/tricu --help
Usage
CLI
Evaluate one or more files:
tricu eval program.tri
tricu eval --format decode program.tri
tricu eval --output result.txt program.tri
Annotations are parsed but currently ignored at runtime; the contract layer is not yet wired into evaluation or workspace module auto-builds.
Compile/import/export Arboricx bundles:
tricu arboricx compile --file program.tri --output program.arboricx
tricu arboricx import --file program.arboricx --module program
tricu arboricx export --module prelude --output prelude.arboricx
Inspect store aliases:
tricu store alias list --kind modules
tricu store alias get --kind modules prelude
REPL
Running tricu with no subcommand starts the REPL. The REPL uses the same
filesystem content store and workspace module loader as the CLI.
Useful commands:
!load FILE load/evaluate a .tri file without printing a result
!store [PATH] show or set the content-addressed store
!format decode set output format by name
!env list current in-memory bindings
!load supports filename tab completion. Normal REPL input also supports tab
completion for names currently in the REPL environment.