2024-12-31 10:00:52 -06:00
2024-12-31 10:00:52 -06:00
2024-12-27 08:17:06 -06:00
2024-12-18 18:59:07 -06:00
2024-12-29 08:29:25 -06:00
2024-12-18 19:15:56 -06:00
2024-12-31 10:00:52 -06:00
2024-12-18 18:59:07 -06:00
2024-12-31 10:00:52 -06:00

tricu

Introduction

tricu (pronounced like "tree-shoe" in English) is a purely functional interpreted language implemented in Haskell. I'm developing tricu to further research the possibilities offered by the various forms of Tree Calculi.

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
  2. Function definitions/assignments
  3. Lambda abstractions eliminated to Tree Calculus forms
  4. List, Number, and String literals
  5. Parentheses for grouping function application

These features move us cleanly out of the 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?

-- Anything after `--` on a single line is a comment
-- We can define functions or "variables" as Tree Calculus values
false = t 
_ = t
true = t t
-- We can define functions as lambda expressions that are eliminated to Tree
-- Calculus terms.
id = (\a : a) -- `id` evaluates to the TC form of: t (t (t t)) t
triage = (\a b c : t (t a b) c)
-- Intensionality! We can inspect program structure, not just inputs/outputs:
test = triage "Leaf" (\_ : "Stem") (\_ _ : "Fork")

-- REPL
-- `tricu <` is the input prompt
-- `tricu >` is the Tree Calculus form output. Most are elided below.
-- `READ -:` is an attempt to interpret the TC output as strings/numbers.
tricu < test t
tricu > Fork (Fork Leaf (Fork ...) ... ) 
READ -: "Leaf"
tricu < test (t t)
READ -: "Stem"
tricu < test (t t t)
READ -: "Fork"
tricu < map (\i : listConcat i " is super cool!") [("Tree Calculus") ("Intensionality") ("tricu")]
READ -: ["Tree Calculus is super cool!", "Intensionality is super cool!", "tricu is super cool!"]

Installation and Use

You can easily build and/or 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
tricu - compiler 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 compile [OPTIONS]
  Compile a file and return the result of the expression in the final line

  -f --file=FILE      Relative or absolute path to file input for compilation
  -o --output=OUTPUT  Optional output file path for resulting output
  -t --form=FORM      Output form: (tree|ast|ternary|ascii)

tricu decode [OPTIONS]
  Decode a Tree Calculus value into a string representation

  -f --input=FILE     Optional file path containing a Tree Calculus value.
                      Defaults to stdin.

Acknowledgements

Tree Calculus was discovered by Barry Jay.

treecalcul.us is an excellent website with an intuitive playground created by Johannes Bader that introduced me to Tree Calculus. If tricu sounds interesting but compiling this repo sounds like a hassle, you should check out his site.

Description
A micro-language for exploring Tree Calculus
Readme
Languages
Haskell 97%
Nix 3%