Skip to content

Instantly share code, notes, and snippets.

@yamasushi
Created May 16, 2013 23:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yamasushi/5595977 to your computer and use it in GitHub Desktop.
Save yamasushi/5595977 to your computer and use it in GitHub Desktop.
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