From 1d5103224d34d6eb436f4376196626467a9779bf Mon Sep 17 00:00:00 2001
From: AwesomeAdam54321 <[email protected]>
Date: Wed, 30 Sep 2026 15:01:48 +0800
Subject: [PATCH] runtime: Support immutable records.

* src/runtime/mit-macros.scm: Define `define-immutable-record-type`.
* src/runtime/runtime.pkg: Export it.
---
 src/runtime/mit-macros.scm | 43 +++++++++++++++++++++++++++++++++++++-
 src/runtime/runtime.pkg    |  6 +++++-
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/runtime/mit-macros.scm b/src/runtime/mit-macros.scm
index 941cadc4..48e9bdc6 100644
--- a/src/runtime/mit-macros.scm
+++ b/src/runtime/mit-macros.scm
@@ -470,6 +470,47 @@ USA.
        (syntax-rules ()
         ((_ arg ...) expr))))))
+(define-syntax $define-immutable-record-type
+  (syntax-rules ()
+    ((_ type record pred clause ...)
+     (begin
+       ($define-record type pred record)
+       ($define-fields type clause ...)))))
+
+(define-syntax $define-record
+  (syntax-rules ()
+    ((_ type pred (name field ...))
+     (begin
+       (define type (make-record-type (symbol->string 'name) '(field ...)))
+       (define name (record-constructor type '(field ...)))
+       (define pred (record-predicate type))))))
+
+(define *field-table* '())
+(define-syntax $define-fields
+  (syntax-rules ()
+    ((_ type) type)
+    ((_ type (field accessor) clause ...)
+     (begin
+       (define accessor (record-accessor type 'field))
+       (set! *field-table*
+            (cons (cons `(,type accessor) (record-modifier type 'field))
+                  *field-table*))
+       ($define-fields type clause ...)))))
+
+(define-syntax $set-fields
+  (syntax-rules ()
+    ((_ record clause ...)
+     (let ((%set-field
+           (lambda (c rec)
+             ((cdr (assoc `(,(record-type-descriptor rec) ,(caar c)) 
*field-table*))
+              rec (eval (cadr c) user-initial-environment))
+             rec)))
+       (fold %set-field (copy-record record) '(clause ...))))))
+
+(define-syntax $set-field
+  (syntax-rules ()
+    ((_ record field val) ($set-fields record (field val)))))
+
 (define $guard
   (spar-transformer->runtime
    (delay
@@ -1117,4 +1158,4 @@ USA.
                       (append req opt (list rest)))
                (apply scons-call
                       (scons-call racc robj)
-                      (append req opt)))))))))
\ No newline at end of file
+                      (append req opt)))))))))
diff --git a/src/runtime/runtime.pkg b/src/runtime/runtime.pkg
index 829bafd0..9e35a253 100644
--- a/src/runtime/runtime.pkg
+++ b/src/runtime/runtime.pkg
@@ -5249,6 +5249,10 @@ USA.
          (define-record-type $define-record-type) ;(scheme base)
          (define-values $define-values) ;(scheme base)
          (define-syntax-rule $define-syntax-rule)
+         (define-immutable-record-type $define-immutable-record-type)
+         *field-table*
+         (set-fields $set-fields)
+         (set-field $set-field)
          (delay $delay)                ;(scheme lazy)
          (delay-force $delay-force)    ;(scheme lazy)
          (do $do)                      ;(scheme base)
@@ -7096,4 +7100,4 @@ USA.
   (export (runtime procedure)
          apply-hook-type-code)
   (export (runtime types)
-         apply-hook-type-code))
\ No newline at end of file
+         apply-hook-type-code))
--
2.54.0

Reply via email to