blc 0.6.0

An implementation of the binary lambda calculus.
Documentation
extern crate blc;
extern crate lambda_calculus;

use blc::*;
use blc::encoding::lambda::encode;
use blc::execution::Input;
use lambda_calculus::*;
use lambda_calculus::data::num::church::{is_zero, rem};

#[test]
fn fizz_buzz() {
    let fizzbuzz_single =
        abs(
            app!(
                is_zero(),
                app!(rem(), Var(1), 15.into_church()),
                encode(&*b"FizzBuzz"),
                app!(
                    is_zero(),
                    app!(rem(), Var(1), 3.into_church()),
                    encode(&*b"Fizz"),
                    app!(
                        is_zero(),
                        app!(rem(), Var(1), 5.into_church()),
                        encode(&*b"Buzz"),
                        Var(1)
                    )
                )
            )
        );
    let fizzbuzz_blc = to_bits(&fizzbuzz_single);

    assert_eq!(
        run(&*fizzbuzz_blc, Input::Bits(&to_bits(&1.into_church()))).unwrap(),
        "(λλ21)" // Church-encoded 1
    );

    assert_eq!(
        run(&*fizzbuzz_blc, Input::Bits(&to_bits(&2.into_church()))).unwrap(),
        "(λλ2(21))" // Church-encoded 2
    );
    assert_eq!(
        run(&*fizzbuzz_blc, Input::Bits(&to_bits(&3.into_church()))).unwrap(),
        "Fizz"
    );

    assert_eq!(
        run(&*fizzbuzz_blc, Input::Bits(&to_bits(&4.into_church()))).unwrap(),
        "(λλ2(2(2(21))))" // Church-encoded 4
    );

    assert_eq!(
        run(&*fizzbuzz_blc, Input::Bits(&to_bits(&5.into_church()))).unwrap(),
        "Buzz"
    );

    assert_eq!(
        run(&*fizzbuzz_blc, Input::Bits(&to_bits(&15.into_church()))).unwrap(),
        "FizzBuzz"
    );
}