Author: yamakenz
Date: Sun Mar 30 13:12:31 2008
New Revision: 5372

Modified:
  trunk/scm/light-record.scm
  trunk/scm/wlos.scm

Log:
* scm/light-record.scm
 - (%define-record-generic): Removed
 - (%define-record-getter, %define-record-setter): New macro
 - (define-record-generic): Merge %define-record-generic
 - (define-vector-record, define-list-record, define-record):
   Follow the changes
* scm/wlos.scm
 - (make-class-object-name, %define-class): Removed
 - (%define-methods): New macro
 - (define-class): Merge %define-class


Modified: trunk/scm/light-record.scm
==============================================================================
--- trunk/scm/light-record.scm  (original)
+++ trunk/scm/light-record.scm  Sun Mar 30 13:12:31 2008
@@ -54,7 +54,7 @@
;;                            <list2record> <record-copy>
;;                            <record-ref> <record-set!>)
;;
-;; <record name>   ::= <symbol>
+;; <record name>   ::= <identifier>
;; <list2record>   ::= <procedure>
;; <record-copy>   ::= <procedure>
;; <record-ref>    ::= <procedure>
@@ -171,49 +171,61 @@
                    (record-set! rec index val))))
      (%retrieve-record-accessor index setter))))

-(define %define-record-generic
-  (lambda (rec-name fld-specs list->record record-copy record-ref record-set!)
-    ;; define record field specs
-    (eval `(define ,(make-record-spec-name rec-name) ',fld-specs)
-         (interaction-environment))
-    ;; define record object constructor
-    (let ((constructor-name (make-record-constructor-name rec-name))
-         (constructor (%make-record-constructor
-                       rec-name fld-specs list->record)))
-      (eval `(define ,constructor-name ,constructor)
-           (interaction-environment)))
-    ;; define record object duplicator
-    (eval `(define ,(make-record-duplicator-name rec-name) ,record-copy)
-         (interaction-environment))
-    ;; define record field accessors
-    (for-each (lambda (fld-name index)
-               (let ((getter-name (make-record-getter-name rec-name fld-name))
-                     (getter      (%make-record-getter index record-ref))
-                     (setter-name (make-record-setter-name rec-name fld-name))
-                     (setter      (%make-record-setter index record-set!)))
-                 (eval `(define ,getter-name ,getter)
-                       (interaction-environment))
-                 (eval `(define ,setter-name ,setter)
-                       (interaction-environment))))
-             (map record-field-spec-name fld-specs)
-             (iota (length fld-specs)))))
+(define-macro %define-record-getter
+  (lambda (rec-name fld-name index record-ref)
+    (let ((getter-name (make-record-getter-name rec-name fld-name))
+         (getter      (%make-record-getter index record-ref)))
+      `(define ,getter-name ,getter))))
+
+(define-macro %define-record-setter
+  (lambda (rec-name fld-name index record-set!)
+    (let ((setter-name (make-record-setter-name rec-name fld-name))
+         (setter      (%make-record-setter index record-set!)))
+      `(define ,setter-name ,setter))))
+
+;;(define-macro %define-record-accessors
+;;  (lambda (rec-name fld-specs record-ref record-set!)
+;;    (cons 'begin
+;;       (map (lambda (fld-name index)
+;;              `(begin
+;;                 (%define-record-getter ,rec-name ,fld-name ,index
+;;                                        ,record-ref)
+;;                 (%define-record-setter ,rec-name ,fld-name ,index
+;;                                        ,record-set!)))
+;;            (map record-field-spec-name fld-specs)
+;;            (iota (length fld-specs))))))

(define-macro define-record-generic
  (lambda (rec-name fld-specs list->record record-copy record-ref record-set!)
-    `(%define-record-generic
-      ',rec-name ,fld-specs
-      ,list->record ,record-copy ,record-ref ,record-set!)))
+    `(begin
+       ;; define record field specs
+       (define ,(make-record-spec-name rec-name) ,fld-specs)
+       ;; define record object constructor
+       (define ,(make-record-constructor-name rec-name)
+        (%make-record-constructor ',rec-name ,fld-specs ,list->record))
+       ;; define record object duplicator
+       (define ,(make-record-duplicator-name rec-name) ,record-copy)
+       ;; define record field accessors
+       (cons 'begin
+            ,(map (lambda (fld-name index)
+                    `(begin
+                       (%define-record-getter ,rec-name ,fld-name ,index
+                                              ,record-ref)
+                       (%define-record-setter ,rec-name ,fld-name ,index
+                                              ,record-set!)))
+                  (map record-field-spec-name (eval fld-specs 
(interaction-environment)))
+                  (iota (length (eval fld-specs 
(interaction-environment)))))))))

(define-macro define-vector-record
  (lambda (rec-name fld-specs)
-    `(%define-record-generic
-      ',rec-name ,fld-specs
-      list->vector vector-copy vector-ref vector-set!)))
+    `(define-record-generic
+       ,rec-name ,fld-specs
+       list->vector vector-copy vector-ref vector-set!)))

(define-macro define-list-record
  (lambda (rec-name fld-specs)
-    `(%define-record-generic
-       ',rec-name ,fld-specs
+    `(define-record-generic
+       ,rec-name ,fld-specs
       list-copy list-copy list-ref %list-set!)))

;; Backward compatibility
@@ -223,7 +235,7 @@
;; (e.g. (list-ref spec 2) and so on may be used)
(define define-record
  (lambda (rec-name fld-specs)
-    (eval `(define-list-record ,rec-name ',fld-specs)
+    (eval `(define-list-record ,rec-name ,fld-specs)
          (interaction-environment))
    (let ((constructor-name (make-record-constructor-name rec-name))
          (legacy-constructor-name (symbol-append rec-name %HYPHEN-SYM 'new)))

Modified: trunk/scm/wlos.scm
==============================================================================
--- trunk/scm/wlos.scm  (original)
+++ trunk/scm/wlos.scm  Sun Mar 30 13:12:31 2008
@@ -185,10 +185,6 @@
  (lambda (klass method-name proc)
    `(%class-set-method! ,klass ',method-name ,proc)))

-(define make-class-object-name
-  (lambda (class-name)
-    class-name))
-
(define %make-class
  (lambda (super fld-specs+ method-names+)
    (let ((ancestors (if (eq? super class)  ;; bootstrap
@@ -205,37 +201,34 @@
      (class-set-method-names! klass method-names)
      klass)))

-(define %define-class
-  (lambda (name super fld-specs+ method-names+)
-    (let ((klass (%make-class super fld-specs+ method-names+)))
-      ;; define class object
-      (eval `(define ,(make-class-object-name name) ',klass)
-           (interaction-environment))
-      ;; define instance structure as record
-      ;; FIXME: hardcoded define-vector-record
-      (eval `(define-vector-record ,name ',(class-field-specs klass))
-           (interaction-environment))
-      ;; redefine record object constructor as accepting class-less args
-      (let* ((constructor-name (make-record-constructor-name name))
-            (orig-constructor (symbol-value constructor-name))
-            (constructor (lambda args
-                           (apply orig-constructor (cons klass args)))))
-       (eval `(define ,constructor-name ,constructor)
-             (interaction-environment)))
-      ;; define method dispatchers
-      ;; overwrites <class>-copy defined by define-*-record
-      (for-each (lambda (method-name)
-                 (let ((dispatcher-name
-                        (make-method-dispatcher-name name method-name))
-                       (dispatcher
-                        (make-method-dispatcher klass method-name)))
-                   (eval `(define ,dispatcher-name ,dispatcher)
-                         (interaction-environment))))
-               (vector->list (class-method-names klass))))))
+(define-macro %define-methods
+  (lambda (klass-name method-names)
+    (cons 'begin
+         (map (lambda (method-name)
+                `(define ,(make-method-dispatcher-name klass-name method-name)
+                   (make-method-dispatcher ,klass-name ',method-name)))
+              method-names))))

(define-macro define-class
  (lambda (name super fld-specs+ method-names+)
-    `(%define-class ',name ,super ,fld-specs+ ,method-names+)))
+    (let ((klass (apply %make-class
+                       (eval `(list ,super ,fld-specs+ ,method-names+)
+                             (interaction-environment)))))
+      `(begin
+        ;; define class object
+        (define ,name ',klass)
+        ;; define instance structure as record
+        ;; FIXME: hardcoded define-vector-record
+        (define-vector-record ,name (class-field-specs ',klass))
+        ;; redefine record object constructor as accepting class-less args
+        (define ,(make-record-constructor-name name)
+          (let ((orig-constructor ,(make-record-constructor-name name)))
+            (lambda args
+              (apply orig-constructor (cons ',klass args)))))
+        ;; define method dispatchers
+        ;; overwrites <class>-copy defined by define-*-record
+        (%define-methods ,name ,(vector->list (class-method-names klass)))))))
+

;;
;; method call

Reply via email to