Allow (vector?) to recognize and disregard record types

This commit is contained in:
Justin Ethier 2020-12-21 23:00:43 -05:00
parent cc3c8f5bac
commit a5fb3b1b14
4 changed files with 35 additions and 17 deletions

View file

@ -476,7 +476,14 @@ object Cyc_is_integer(object o);
//object Cyc_is_cond_var(object o); //object Cyc_is_cond_var(object o);
//object Cyc_is_symbol(object o); //object Cyc_is_symbol(object o);
//object Cyc_is_string(object o); //object Cyc_is_string(object o);
#define Cyc_is_vector(o) (make_boolean(is_object_type(o) && ((list) o)->tag == vector_tag)) object Cyc_is_record(object o);
#define Cyc_is_vector_not_record_type(o) \
(make_boolean(is_object_type(o) && \
((vector) o)->tag == vector_tag && \
( ((vector) o)->num_elements == 0 || \
((vector) o)->elements[0] != Cyc_RECORD_MARKER ) \
))
#define Cyc_is_vector(o) (make_boolean(is_object_type(o) && ((vector) o)->tag == vector_tag))
#define Cyc_is_bytevector(o) (make_boolean(is_object_type(o) && ((list) o)->tag == bytevector_tag)) #define Cyc_is_bytevector(o) (make_boolean(is_object_type(o) && ((list) o)->tag == bytevector_tag))
#define Cyc_is_port(o) (make_boolean(is_object_type(o) && ((list) o)->tag == port_tag)) #define Cyc_is_port(o) (make_boolean(is_object_type(o) && ((list) o)->tag == port_tag))
#define Cyc_is_mutex(o) (make_boolean(is_object_type(o) && ((list) o)->tag == mutex_tag)) #define Cyc_is_mutex(o) (make_boolean(is_object_type(o) && ((list) o)->tag == mutex_tag))

View file

@ -1990,6 +1990,18 @@ object Cyc_is_integer(object o)
// return boolean_f; // return boolean_f;
//} //}
object Cyc_is_record(object o)
{
vector v = o;
if (is_object_type(o) &&
v->tag == vector_tag &&
v->num_elements > 0 &&
v->elements[0] == Cyc_RECORD_MARKER) {
return boolean_t;
}
return boolean_f;
}
object Cyc_is_procedure(void *data, object o) object Cyc_is_procedure(void *data, object o)
{ {
int tag; int tag;
@ -5099,7 +5111,7 @@ void _bytevector_127(void *data, object cont, object args)
void _vector_127(void *data, object cont, object args) void _vector_127(void *data, object cont, object args)
{ {
Cyc_check_num_args(data, "vector?", 1, args); Cyc_check_num_args(data, "vector?", 1, args);
return_closcall1(data, cont, Cyc_is_vector(car(args))); return_closcall1(data, cont, Cyc_is_vector_not_record_type(car(args)));
} }
void _string_127(void *data, object cont, object args) void _string_127(void *data, object cont, object args)

View file

@ -1978,12 +1978,7 @@
(vector record-marker name field-tags)) (vector record-marker name field-tags))
(define (make-type-predicate pred name) (define (make-type-predicate pred name)
(lambda (obj) (lambda (obj)
(and (vector? obj) (and (record? obj)
(= (vector-length obj) 3)
(or
(equal? (vector-ref obj 0) record-marker)
(equal? (vector-ref obj 0) (list 'record-marker))
)
(equal? (vector-ref obj 1) name)))) (equal? (vector-ref obj 1) name))))
(define (make-constructor make name) (define (make-constructor make name)
(lambda args (lambda args
@ -2029,14 +2024,18 @@
(and (not (null? lis)) (and (not (null? lis))
(if (eq? e (car lis)) n (lp (cdr lis) (+ n 1))))))) (if (eq? e (car lis)) n (lp (cdr lis) (+ n 1)))))))
(define (record? obj) ;(define (record? obj)
(and (vector? obj) ; (and (vector? obj)
(> (vector-length obj) 0) ; (> (vector-length obj) 0)
(or ; (or
(equal? record-marker (vector-ref obj 0)) ; (equal? record-marker (vector-ref obj 0))
(equal? (list 'record-marker) (vector-ref obj 0)) ; (equal? (list 'record-marker) (vector-ref obj 0))
) ; )
)) ; ))
(define-c record?
"(void *data, int argc, closure _, object k, object obj)"
" return_closcall1(data, k, Cyc_is_record(obj)); ")
(define (is-a? obj rtype) (define (is-a? obj rtype)
(and (record? obj) (and (record? obj)

View file

@ -680,7 +680,7 @@
((eq? p 'procedure?) "Cyc_is_procedure") ((eq? p 'procedure?) "Cyc_is_procedure")
((eq? p 'Cyc-macro?) "Cyc_is_macro") ((eq? p 'Cyc-macro?) "Cyc_is_macro")
((eq? p 'port?) "Cyc_is_port") ((eq? p 'port?) "Cyc_is_port")
((eq? p 'vector?) "Cyc_is_vector") ((eq? p 'vector?) "Cyc_is_vector_not_record_type")
((eq? p 'bytevector?) "Cyc_is_bytevector") ((eq? p 'bytevector?) "Cyc_is_bytevector")
((eq? p 'string?) "Cyc_is_string") ((eq? p 'string?) "Cyc_is_string")
((eq? p 'eof-object?) "Cyc_is_eof_object") ((eq? p 'eof-object?) "Cyc_is_eof_object")