scheme4r 0.2.3

Scheme interpreter for rust
Documentation
use scheme4r::{eval, Value};

#[test]
fn character_literals_and_conversions_work() {
    let value = eval("#\\A").unwrap();
    assert!(matches!(value, Value::Character('A')));

    let value = eval("#\\space").unwrap();
    assert!(matches!(value, Value::Character(' ')));

    let value = eval("(char->integer #\\A)").unwrap();
    assert!(matches!(value, Value::Number(65)));

    let value = eval("(integer->char 66)").unwrap();
    assert!(matches!(value, Value::Character('B')));
}

#[test]
fn vectors_support_literals_conversion_and_mutation() {
    let value = eval("(vector-length #(1 2 3))").unwrap();
    assert!(matches!(value, Value::Number(3)));

    let value = eval("(vector-ref #(1 2 3) 1)").unwrap();
    assert!(matches!(value, Value::Number(2)));

    let value = eval(
        "\
        (let ((v (vector 1 2 3)))
          (vector-set! v 1 9)
          (vector->list v))
        ",
    )
    .unwrap();
    assert_eq!(format!("{value}"), "(1 9 3)");

    let value = eval("(list->vector '(4 5 6))").unwrap();
    assert_eq!(format!("{value}"), "#(4 5 6)");
}

#[test]
fn bytevectors_support_literals_and_mutation() {
    let value = eval("(bytevector-length #u8(1 2 255))").unwrap();
    assert!(matches!(value, Value::Number(3)));

    let value = eval("(bytevector-u8-ref #u8(1 2 255) 2)").unwrap();
    assert!(matches!(value, Value::Number(255)));

    let value = eval(
        "\
        (let ((bv (bytevector 1 2 3)))
          (bytevector-u8-set! bv 1 42)
          bv)
        ",
    )
    .unwrap();
    assert_eq!(format!("{value}"), "#u8(1 42 3)");
}

#[test]
fn quasiquote_supports_unquote_and_splicing_for_lists() {
    let value = eval("`(1 ,(+ 1 2) ,@(list 4 5) 6)").unwrap();
    assert_eq!(format!("{value}"), "(1 3 4 5 6)");
}

#[test]
fn quasiquote_supports_vectors_and_nested_unquote() {
    let value = eval("`#(1 ,(+ 1 2) ,@(list 4 5))").unwrap();
    assert_eq!(format!("{value}"), "#(1 3 4 5)");

    let value = eval("`(outer `(inner ,(+ 1 2)))").unwrap();
    assert_eq!(
        format!("{value}"),
        "(outer (quasiquote (inner (unquote (+ 1 2)))))"
    );
}