From 4540c11a48710d92164e6cf0b6af70bbe7022487 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Tue, 2 Feb 2016 22:12:18 -0500 Subject: [PATCH] Include additional info with record instances --- kons.scm | 48 +++++++++++++++++++++++++++--------------------- srfi/9.sld | 9 +++++++-- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/kons.scm b/kons.scm index 55e95bbe..b66bf170 100644 --- a/kons.scm +++ b/kons.scm @@ -4,28 +4,28 @@ (srfi 9) ) -;((lambda () -; -;(define-record-type -; (kons x y) -; pare? -; (x kar) ;TODO: set-kar!) -; (y kdr)) -; -;(write -; (list -; (pare? (kons 1 2)) ; =. #t -; (pare? (cons 1 2)) ; =. #f -;; (kar (kons 1 2)) ; =. 1 -;; (kdr (kons 1 2)) ; =. 2 -;; (let ((k (kons 1 2))) -;; (set-kar! k 3) -;; (kar k)) ;=. 3 -;)) -;)) +;; TODO: seems begins are not spliced when part of an applied lambda?? +((lambda () -(define (register-simple-type #f (quote (x y)))) -;(define pare? vector?) ;(make-type-predicate pare? )) +(define-record-type + (kons x y) + pare? + (x kar) ;TODO: set-kar!) + (y kdr)) + +(write + (list + (pare? (kons 1 2)) ; =. #t + (pare? (cons 1 2)) ; =. #f +; (kar (kons 1 2)) ; =. 1 +; (kdr (kons 1 2)) ; =. 2 +; (let ((k (kons 1 2))) +; (set-kar! k 3) +; (kar k)) ;=. 3 +)) + +;(define (register-simple-type #f (quote (x y)))) +;(define pare? (make-type-predicate pare? )) ;(define kons ; ((lambda (%make) ; (lambda (x y) @@ -37,10 +37,16 @@ ; (make-constructor "kons" ))) ;(write ; (list +; (kons 1 2) ; (pare? (kons 1 2)) ; (pare? (cons 1 4)) ;)) +)) +;(((lambda () +;(define (register-simple-type #f (quote (x y)))) +;(define pare? (make-type-predicate pare? )) +;(define kons ((lambda (%make) (lambda (x y) ((lambda (res) (slot-set! res (type-slot-offset (quote y)) y) (slot-set! res (type-slot-offset (quote x)) x) res) (%make)))) (make-constructor "kons" ))) (write (list (pare? (kons 1 2)) (pare? (cons 1 2))))))) ;(define (make-lambda) ; (lambda (a b c) (write (+ a b c)))) ;(define test (make-lambda)) diff --git a/srfi/9.sld b/srfi/9.sld index a356b4d9..12073ddc 100644 --- a/srfi/9.sld +++ b/srfi/9.sld @@ -29,14 +29,19 @@ (define (make-constructor make name) (lambda () (let* ((field-tags (vector-ref name 2)) - (new (make-vector (length field-tags) #f))) + (field-values (make-vector (length field-tags) #f)) + (new (make-vector 3 #f)) + ) + (vector-set! new 0 record-marker) + (vector-set! new 1 name) + (vector-set! new 2 field-values) new))) (define (type-slot-offset name sym) (let ((field-tags (vector-ref name 2))) (list-index2 sym field-tags))) (define (slot-set! name obj idx val) (let ((vec obj)) ;; TODO: get actual slots from obj - (vector-set! vec idx val))) + (vector-set! (vector-ref vec 2) idx val))) (define-syntax define-record-type (er-macro-transformer