Created
May 16, 2013 23:39
-
-
Save yamasushi/5595977 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/gauche/record.scm b/lib/gauche/record.scm | |
index f00170d..f564199 100644 | |
--- a/lib/gauche/record.scm | |
+++ b/lib/gauche/record.scm | |
@@ -242,6 +242,11 @@ | |
`(apply vector ,@(cdr tmps) ,(car tmps)) | |
argv) | |
+(define-ctor-generators %list-ctor-default %list-ctor-custom | |
+ `(list ,@vars) | |
+ `(apply list ,@(cdr tmps) ,(car tmps)) | |
+ argv) | |
+ | |
;; Returns a vector where V[k] = i means k-th argument of the constructor | |
;; initializes i-th field. | |
(define (%calculate-field-mapvec allnames fieldspecs) | |
@@ -269,6 +274,15 @@ | |
[nfields (vector-length all-names)]) | |
(%vector-ctor-custom rtd (vector-length (car rest))))))) | |
+(define-method rtd-constructor ((rtd <list-pseudo-record-meta>) . rest) | |
+ (%check-rtd rtd) | |
+ (if (null? rest) | |
+ (%list-ctor-default rtd (length (slot-ref rtd'slots))) | |
+ (let1 all-names (rtd-all-field-names rtd) | |
+ (let ([mapvec (%calculate-field-mapvec all-names (car rest))] | |
+ [nfields (vector-length all-names)]) | |
+ (%list-ctor-custom rtd (vector-length (car rest))))))) | |
+ | |
(define-method rtd-predicate ((rtd <record-meta>)) (^o (is-a? o rtd))) | |
(define-method rtd-predicate ((rtd <pseudo-record-meta>)) | |
(errorf "pseudo record type ~s cannot have a predicate" rtd)) | |
@@ -297,6 +311,14 @@ | |
(^o (vector-ref o k)) | |
(^(o v) (vector-set! o k v)))))) | |
+(define-method rtd-accessor ((rtd <list-pseudo-record-meta>) field) | |
+ (receive (k immutable?) (%get-slot-index rtd field #f) | |
+ (if immutable? | |
+ (^o (list-ref o k)) | |
+ (getter-with-setter | |
+ (^o (list-ref o k)) | |
+ (^(o v) (list-set! o k v)))))) | |
+ | |
(define-method rtd-mutator ((rtd <record-meta>) field) | |
(receive (k immutable?) (%get-slot-index rtd field #t) | |
(when immutable? | |
@@ -309,6 +331,12 @@ | |
(errorf "slot ~a of record ~s is immutable" field rtd)) | |
(^(o v) (vector-set! o k v)))) | |
+(define-method rtd-mutator ((rtd <list-pseudo-record-meta>) field) | |
+ (receive (k immutable?) (%get-slot-index rtd field #t) | |
+ (when immutable? | |
+ (errorf "slot ~a of record ~s is immutable" field rtd)) | |
+ (^(o v) (list-set! o k v)))) | |
+ | |
;;; | |
;;; Syntactic layer | |
;;; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment