mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-12 15:27:36 +02:00
bug fixes for record types
This commit is contained in:
parent
76a3778dda
commit
7276bcbacf
4 changed files with 35 additions and 12 deletions
|
@ -1,7 +1,7 @@
|
|||
;; A temporary test file
|
||||
(import (scheme base)
|
||||
(scheme write)
|
||||
(srfi 9)
|
||||
;(srfi 9)
|
||||
)
|
||||
|
||||
;; TODO: seems begins are not spliced when part of an applied lambda??
|
||||
|
|
|
@ -17,16 +17,17 @@
|
|||
; TODO: need filter for the next two. also, they really belong in SRFI-1, not here
|
||||
;delete
|
||||
;delete-duplicates
|
||||
;; TODO: possibly relocating here in the future
|
||||
;; Record types
|
||||
define-record-type
|
||||
record?
|
||||
; register-simple-type
|
||||
; make-type-predicate
|
||||
; make-constructor
|
||||
; make-getter
|
||||
; make-setter
|
||||
; slot-set!
|
||||
; type-slot-offset
|
||||
register-simple-type
|
||||
make-type-predicate
|
||||
make-constructor
|
||||
make-getter
|
||||
make-setter
|
||||
slot-set!
|
||||
type-slot-offset
|
||||
;; END records
|
||||
receive
|
||||
abs
|
||||
max
|
||||
|
@ -1385,7 +1386,7 @@
|
|||
new)))
|
||||
(define (type-slot-offset name sym)
|
||||
(let ((field-tags (vector-ref name 2)))
|
||||
(list-index2 sym field-tags)))
|
||||
(_list-index sym field-tags)))
|
||||
(define (slot-set! name obj idx val)
|
||||
(let ((vec obj)) ;; TODO: get actual slots from obj
|
||||
(vector-set! (vector-ref vec 2) idx val)))
|
||||
|
@ -1396,6 +1397,17 @@
|
|||
(lambda (obj val)
|
||||
(vector-set! (vector-ref obj 2) idx val)))
|
||||
|
||||
;; Find index of element in list, or -1 if not found
|
||||
(define _list-index
|
||||
(lambda (e lst)
|
||||
(if (null? lst)
|
||||
-1
|
||||
(if (eq? (car lst) e)
|
||||
0
|
||||
(if (= (_list-index e (cdr lst)) -1)
|
||||
-1
|
||||
(+ 1 (_list-index e (cdr lst))))))))
|
||||
|
||||
(define (record? obj)
|
||||
(and (vector? obj)
|
||||
(> (vector-length obj) 0)
|
||||
|
|
13
srfi/9.sld
13
srfi/9.sld
|
@ -45,7 +45,7 @@
|
|||
new)))
|
||||
(define (type-slot-offset name sym)
|
||||
(let ((field-tags (vector-ref name 2)))
|
||||
(list-index2 sym field-tags)))
|
||||
(_list-index sym field-tags)))
|
||||
(define (slot-set! name obj idx val)
|
||||
(let ((vec obj)) ;; TODO: get actual slots from obj
|
||||
(vector-set! (vector-ref vec 2) idx val)))
|
||||
|
@ -61,6 +61,17 @@
|
|||
(> (vector-length obj) 0)
|
||||
(equal? record-marker (vector-ref obj 0))))
|
||||
|
||||
;; Find index of element in list, or -1 if not found
|
||||
(define _list-index
|
||||
(lambda (e lst)
|
||||
(if (null? lst)
|
||||
-1
|
||||
(if (eq? (car lst) e)
|
||||
0
|
||||
(if (= (_list-index e (cdr lst)) -1)
|
||||
-1
|
||||
(+ 1 (_list-index e (cdr lst))))))))
|
||||
|
||||
(define-syntax define-record-type
|
||||
(er-macro-transformer
|
||||
(lambda (expr rename compare)
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
(scheme read)
|
||||
(scheme write)
|
||||
(scheme eval)
|
||||
(srfi 9)
|
||||
;(srfi 9)
|
||||
)
|
||||
|
||||
(define *num-passed* 0)
|
||||
|
|
Loading…
Add table
Reference in a new issue