From fc6647fbb3058e5eb1c3079c93428c845c4523b9 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Sat, 6 Feb 2016 03:19:36 -0500 Subject: [PATCH] Added (record?) --- debug/kons.scm | 2 ++ scheme/base.sld | 15 +++++++++------ srfi/9.sld | 6 ++++++ tests/unit-tests.scm | 2 ++ 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/debug/kons.scm b/debug/kons.scm index f8672e6d..d1cd89a2 100644 --- a/debug/kons.scm +++ b/debug/kons.scm @@ -22,6 +22,8 @@ (let ((k (kons 1 2))) (set-kar! k 3) (kar k)) ;=. 3 + (record? (kons 1 2)) + (record? (cons 1 2)) )) ;(define (register-simple-type #f (quote (x y)))) diff --git a/scheme/base.sld b/scheme/base.sld index 4a76a310..266a1eec 100644 --- a/scheme/base.sld +++ b/scheme/base.sld @@ -182,9 +182,17 @@ ; open-input-string ; open-output-string ; -; for a lot of the following, need begin-splicing, or syntax-rules +; ;; no binary/text ports yet ; binary-port? +; textual-port? +; +; ;; syntax-rules +; syntax-error +; syntax-rules +; parameterize ; define-values +; +; for a lot of the following, need begin-splicing, or syntax-rules ; guard ; import ; include @@ -193,11 +201,6 @@ ; let-values ; letrec* ; letrec-syntax -; parameterize -; record? -; syntax-error -; syntax-rules -; textual-port? ;;;; ) (begin diff --git a/srfi/9.sld b/srfi/9.sld index db4f6386..c85d594c 100644 --- a/srfi/9.sld +++ b/srfi/9.sld @@ -4,6 +4,7 @@ ;;; This is based on the implementation of SRFI 9 from chibi scheme (define-library (srfi 9) (export + record? define-record-type register-simple-type make-type-predicate @@ -51,6 +52,11 @@ (lambda (obj val) (vector-set! (vector-ref obj 2) idx val))) + (define (record? obj) + (and (vector? obj) + (> (vector-length obj) 0) + (equal? record-marker (vector-ref obj 0)))) + (define-syntax define-record-type (er-macro-transformer (lambda (expr rename compare) diff --git a/tests/unit-tests.scm b/tests/unit-tests.scm index f6f2981f..171ff155 100644 --- a/tests/unit-tests.scm +++ b/tests/unit-tests.scm @@ -336,6 +336,8 @@ (set-kar! k 3) (kar k)) 3) +(assert:equal "Record type predicate (t)" (record? (kons 1 2)) #t) +(assert:equal "Record type predicate (f)" (record? (cons 1 2)) #f) ;; END records ; TODO: use display, output without surrounding quotes