# [`boundvariable`][]

Research notes regarding the [Cult of the Bound Variable][] and affiliates.

[`boundvariable`]: https://git.rcrnstn.net/rcrnstn/cult-of-the-bound-variable
[Cult of the Bound Variable]: http://boundvariable.org

## Universal Machine (UM)

### An puzzling appeal

The association of amateur computational archaeolinguistics, of which I am
a/the member, has heard the call of Professor Emeritus Harry Q. Bovik and
intend to contribute to the [task][] outlined if we can.

As an archaeolinguist my first instinct is to sort through what we know so far
and archive it locally, I hope Professor Bovik doesn't not mind. I also hope
you like [AWK][]. The [`Makefile`][] now downloads/generates the following:

-   [`task.txt`][]: Slightly trimmed plain text version of the task.
-   [`sha1sums.txt`][]: File hashes extracted from the task.
-   [`codex-key.txt`][]: Codex key extracted from the task.
-   `codex.umz`: The codex.
-   `sandmark.umz`: The benchmark.
-   [`sandmark-output.txt`][]: Expected output of the benchmark.
-   [`um-spec.txt`][]: Specification for the Universal Machine.
-   `um.um`: CMU Reference implementation of the Universal Machine.

These files are all committed but also added to `.gitignore` and removed by
`make clean`.

[tasks]: http://www.boundvariable.org/task.shtml
[AWK]: https://en.wikipedia.org/wiki/AWK
[`Makefile`]: Makefile
[`task.txt`]: task.txt
[`sha1sums.txt`]: sha1sums.txt
[`codex-key.txt`]: codex-key.txt
[`sandmark-output.txt`]: sandmark-output.txt
[`um-spec.txt`]: um-spec.txt

### Mostly Vetted Platterer (MVP)

I have completed the first version of the implementation, see [`um.cpp`][].

It is as pure as I can make it. If someone wants a concise, readable,
programmatic description of the spec this is the version they should look at
(though reading the spec "blind" is a pleasure).

The `um()` function is 45 self-contained lines. 65 lines total in the file, the
difference being `#include`s and a 11 line `main` to deal with the ugliness of
the outside world. Note that guardrails are only present in `main`, if the
scroll itself has bugs there might be [UB][] galore (which is in spec).

I have added a `um` [Makefile][] target, which is a dependency of the default
`all` target:

```sh
make um
# or simply
make
```

[`um.cpp`]: um.cpp
[UB]: https://en.wikipedia.org/wiki/Undefined_behavior

## License

Licensed under the [ISC License][] unless otherwise noted, see the
[`LICENSE`][] file.

[ISC License]: https://choosealicense.com/licenses/isc
[`LICENSE`]: LICENSE
