scheme4r 0.2.3

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

#[test]
fn boolean_and_symbol_equality_work() {
    let value = eval("(list (boolean=? #t #t #t) (symbol=? 'abc 'abc 'abc))").unwrap();
    assert_eq!(format!("{value}"), "(#t #t)");

    let value = eval("(list (boolean=? #t #f) (symbol=? 'abc 'xyz))").unwrap();
    assert_eq!(format!("{value}"), "(#f #f)");
}

#[test]
fn error_and_raise_surface_runtime_errors() {
    let err = eval("(error \"boom\" 1 'x)").unwrap_err();
    assert_eq!(err.kind, ErrorKind::Runtime);
    assert_eq!(err.message, "exception raised");
    let (object, continuable) = err.as_raised().unwrap();
    assert!(!continuable);
    match object {
        Value::ErrorObject(error) => {
            assert_eq!(error.message(), "boom");
            assert_eq!(
                format!("{}", Value::list(error.irritants().to_vec())),
                "(1 x)"
            );
        }
        other => panic!("expected error object, got {other}"),
    }

    let err = eval("(raise '(a b))").unwrap_err();
    assert_eq!(err.kind, ErrorKind::Runtime);
    assert_eq!(err.message, "exception raised");
    let (object, continuable) = err.as_raised().unwrap();
    assert!(!continuable);
    assert_eq!(format!("{object}"), "(a b)");
}

#[test]
fn values_and_call_with_values_work() {
    let value = eval(
        "\
        (call-with-values
          (lambda () (values 1 2 3))
          (lambda (a b c) (list a b c)))
        ",
    )
    .unwrap();
    assert_eq!(format!("{value}"), "(1 2 3)");

    let value = eval(
        "\
        (call-with-values
          (lambda () (values))
          (lambda () 'empty))
        ",
    )
    .unwrap();
    assert_eq!(format!("{value}"), "empty");

    let value = eval("(values 42)").unwrap();
    assert_eq!(format!("{value}"), "42");
}