CLI - Web - Lambda - PHP Extension - Jupyter
santa-lang
An functional, C-like programming language for solving Advent of Code puzzles.
Influenced by: Rust, Python, Clojure, F#, Scala
Release
Runtime | Platform | Release |
---|---|---|
CLI | Linux/GNU | santa-lang-cli-0.0.3-x86_64-unknown-linux-gnu |
CLI | Apple/Darwin | santa-lang-cli-0.0.3-x86_64-apple-darwin |
CLI | Docker/x86 | ghcr.io/eddmann/santa-lang-cli:0.0.3 |
Web | WASM | @eddmann/santa-lang-wasm@0.0.3 |
Lambda | provided.al2 | arn:aws:lambda:eu-west-1:428533468732:layer:santa-lang:11 |
PHP | Linux/GNU | santa-lang-php-ext-0.0.3-x86_64-linux |
Jupyter | Linux/GNU | santa-lang-jupyter-0.0.3-x86_64-unknown-linux-gnu |
Jupyter | Apple/Darwin | santa-lang-jupyter-0.0.3-x86_64-apple-darwin |
Why?
Over the past several years I have been slowly working through the previous Advent of Code calendars. For each calendar I opt to solve the puzzles in a new programming language, to familiarise myself with other ways of understanding and working. However, there comes a time in each calendar that I grow to dislike some aspect of the language. So I had an idea... why not give this whole programming language design a go. That way if I grow to dislike this language, I only have myself to blame!
Welcome santa-lang, my programming language designed to help tackle Advent of Code puzzles.
Implementations
The language specification and runtime implementation can be seen as two separate concerns; similar to how the Python language has been implemented within CPython/JPython, and ECMAScript within V8/SpiderMonkey. There are two separate implementations of the language (and runner), both of which follow the (informal) specification laid out in this documentation. There is feature parity in-regard to the core language, data types and builtin functions.
TypeScript
Repository: eddmann/santa-lang-ts
This was the initial tree-walking interpreted reference implementation used whilst creating of the language and runner. It allowed for quick exploration of different language constructs, and exercise them with actual Advent of Code problems throughout the 2022 calendar. TypeScript was chosen due to speed of development and minimal friction to try out new ideas. The JavaScript runtime also made it easy to develop the initial CLI, Web and Lambda runtimes; with minimal unique delivery requirements.
Rust
Repository: eddmann/santa-lang-rs - ⭐ This is the recommended implementation
Taking all the learnings from the TypeScript counterpart, the Rust implementation was built to be a more stable and performant tree-walking interpreter. It was felt that the JavaScript runtime could only reach so much performance, and a lower-level language could unlock more performance gains. Along with performance considerations, during its development, there was the addition of a WASM runtime (which aligns with TypeScript's Web counterpart), a PHP extension and a CLI REPL. These features are all unique to the Rust implementation.