
Adds support for several special characters in identifiers. Adds a demo for converting values to source code and another for checking equality. Updates the existing demo and tests to reflect new names for functions returning booleans.
83 lines
3.3 KiB
Markdown
83 lines
3.3 KiB
Markdown
# tricu
|
|
|
|
## Introduction
|
|
|
|
tricu (pronounced "tree-shoe") is a purely functional interpreted language implemented in Haskell. [I'm](https://eversole.co) developing tricu to further research the possibilities offered by the various forms of [Tree Calculi](https://github.com/barry-jay-personal/typed_tree_calculus/blob/main/typed_program_analysis.pdf).
|
|
|
|
tricu offers minimal syntax sugar yet manages to provide a complete, intuitive, and familiar programming environment. There is great power in simplicity. tricu offers:
|
|
|
|
1. `t` operator behaving by the rules of Tree Calculus
|
|
1. Function definitions/assignments
|
|
1. Lambda abstractions eliminated to Tree Calculus forms
|
|
1. List, Number, and String literals
|
|
1. Parentheses for grouping function application
|
|
|
|
These features move us cleanly out of the [turing tarpit](https://en.wikipedia.org/wiki/Turing_tarpit) territory that you may find yourself in if you try working only with the `t` operator.
|
|
|
|
tricu is the word for "tree" in Lojban: `(x1) is a tree of species/cultivar (x2)`. This project was named "sapling" until I discovered the name is already being used for other (completely unrelated) programming language development projects.
|
|
|
|
## What does it look like?
|
|
|
|
```
|
|
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 : lconcat i " world!") [("Hello, ")])
|
|
tricu > "Hello, world!"
|
|
tricu < id (head (map (\i : lconcat i " world!") [("Hello, ")]))
|
|
tricu > "Hello, world!"
|
|
|
|
tricu < -- Intensionality! We can inspect the structure of a function.
|
|
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 write a function to convert a term back to source code
|
|
tricu < toSource not?
|
|
tricu > "(t (t (t t) (t t t)) (t t (t t t)))"
|
|
```
|
|
|
|
## Installation and Use
|
|
|
|
You can easily build and/or run this project using [Nix](https://nixos.org/download/).
|
|
|
|
- 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`
|
|
|
|
```
|
|
tricu Evaluator and REPL
|
|
|
|
tricu [COMMAND] ... [OPTIONS]
|
|
tricu: Exploring Tree Calculus
|
|
|
|
Common flags:
|
|
-? --help Display help message
|
|
-V --version Print version information
|
|
|
|
tricu [repl] [OPTIONS]
|
|
Start interactive REPL
|
|
|
|
tricu eval [OPTIONS]
|
|
Evaluate tricu and return the result of the final expression.
|
|
|
|
-f --file=FILE Input file path(s) for evaluation.
|
|
Defaults to stdin.
|
|
-t --form=FORM Optional output form: (tree|fsl|ast|ternary|ascii).
|
|
Defaults to tricu-compatible `t` tree form.
|
|
|
|
tricu decode [OPTIONS]
|
|
Decode a Tree Calculus value into a string representation.
|
|
|
|
-f --file=FILE Optional input file path to attempt decoding.
|
|
Defaults to stdin.
|
|
```
|
|
|
|
## Acknowledgements
|
|
|
|
Tree Calculus was discovered by [Barry Jay](https://github.com/barry-jay-personal/blog).
|
|
|
|
[treecalcul.us](https://treecalcul.us) is an excellent website with an intuitive playground created by [Johannes Bader](https://johannes-bader.com/) that introduced me to Tree Calculus. If tricu sounds interesting but compiling this repo sounds like a hassle, you should check out his site.
|