scheme4r 0.2.3

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

#[test]
fn define_record_type_generates_constructor_predicate_accessor_and_mutator() {
    let value = eval(
        "\
        (define-record-type <point>
          (make-point x y)
          point?
          (x point-x set-point-x!)
          (y point-y))

        (let ((p (make-point 1 2)))
          (list (point? p)
                (point-x p)
                (point-y p)
                (begin
                  (set-point-x! p 9)
                  (point-x p))))
        ",
    )
    .unwrap();

    assert_eq!(format!("{value}"), "(#t 1 2 9)");
}

#[test]
fn record_predicate_and_accessor_handle_type_mismatch() {
    let value = eval(
        "\
        (define-record-type <point>
          (make-point x y)
          point?
          (x point-x)
          (y point-y))

        (define-record-type <size>
          (make-size w h)
          size?
          (w size-w)
          (h size-h))

        (let ((s (make-size 3 4)))
          (point? s))
        ",
    )
    .unwrap();

    assert!(matches!(value, Value::Boolean(false)));

    let err = eval(
        "\
        (define-record-type <point>
          (make-point x y)
          point?
          (x point-x)
          (y point-y))

        (define-record-type <size>
          (make-size w h)
          size?
          (w size-w)
          (h size-h))

        (let ((s (make-size 3 4)))
          (point-x s))
        ",
    )
    .unwrap_err();

    assert!(err.message.contains("matching record type"));
}