Stupid Template Tricks: Lazy Compile-Time Lists

In this time, the most precious substance in the Universe is the List. The List extends life. The List expands consciousness. The List is vital to functional travel. This post overviews the implementation of a compile-time lazy list in C++ templates, along with a few common list operations, such as…

The Lispers in the Darkness

In the empire of Functional stands the outpost of Lisp. Many pilgrims pass though Lisp every season, but few stay long. Something about Lisp's proximity to certain uncharted regions, regions of which no sane Functional traveller dare speak, keep most from staying more than a day or two. And for…

Stupid Template Tricks: Brainfuck Compile Time Evaluator

Every 2nd grader knows that the C++ template system is Turing complete. So what? Compile time Brainfuck evaluator that's what! It turns out that I'm not the first person who learned me some metaprogramming and thought it would be a good laugh to implement Brainfuck with C++ templates. But in…

Stupid Template Tricks: Reversing Template Parameters on Templated Types

When I came across this Stack Overflow question about reversing a c++ std::tuple type, naturally I wondered if the same could be done to templated types besides std::tuple, i.e. for a templated type T, converting T<P1, P2, ..., Pn> to T<Pn, Pn-1, ..., P1…

Inlining in Khepri - Introduction

I designed Khepri with function inlining in mind, but inlining support was only recently added to the compiler. This post overviews the Khepri compiler's inlining support. A later post will cover some of the specific challenges of inlining Javascript and how Khepri implements inlining. The Need For Inlining The functional…

Incremental Parsing With Feedback in a Web Worker

I previously described running Bennu parsers incrementally. Here I show how we can offload incremental parsing to a web worker, and get realtime feedback as the worker parses data. Example Overview I'm going to develop a simple word count application that uses a Bennu parser run in a web worker…