Rick is a Rust INTERCAL interpreter/compiler.
Rick is modeled closely on the C-INTERCAL
compiler written by Eric S. Raymond and Alex Smith, and some algorithms for
built-in functionality (operators, binary I/O) is adapted from there, as well as
the standard library in syslib.rs
.
Also, all the sample code from the code
directory comes from the C-INTERCAL
distribution. See the CATALOG
file there for an overview of programs.
The idea of printing fractals while compiling is taken from PyPy.
A comprehensive list of INTERCAL resources, including the original manual from 1972, can be found at the C-INTERCAL page.
Rick implements the base INTERCAL-72 language with the following extensions:
COME FROM
- Computed
COME FROM
TRY AGAIN
- Computed
ABSTAIN
- Binary array I/O
The INTERCAL interpreter takes a source file, parses it into an AST (abstract
sadist tree), and interprets the program, going through the statements until
instructed to GIVE UP
. This is roughly 10 times slower than a compiled
version.
Rick can also translate the AST to Rust, which is then compiled by the system
Rust compiler. This is a few orders of magnitude slower than compiling the C
sources generated by C-INTERCAL, but achieves about the same runtime
performance (when compiled with -O
), while being safe Rust code.
Rick itself uses nightly Rust features, but the generated code is stable-only.
Do cargo build
as usual. Then you can cargo run -- --help
to see the
available options for the compiler. Basic usage is cargo run -- input.i
to
generate an executable and cargo run -- -i input.i
to interpret.
You might want to use the -b
flag to get rid of an annoying compiler bug (that
is mandated by the INTERCAL handbook).
Optimizations are activated with -o
(optimizes INTERCAL code, recommended) and
-O
(makes rustc optimize machine code, not recommended unless you have lots of
time or the program is very small). There are a few interesting optimizations,
such as folding the entire program to a "print" statement if it does not depend
on any input.
The test suite consists of input and output files for the demo programs in
code
. Run python test.py
to run the test suite. Use the --all
flag to
also run the most time consuming tests, which will take about 10 minutes.
I tried to put at least rudimentary comments into the code where it matters. If you actually want to delve deeper into the cesspool that is INTERCAL, let me know what I can do better!