chemoelectric

define-record-factory for Gambit Scheme

Dec 8th, 2025
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 2.42 KB | Source Code | 0 0
  1. (define-syntax define-record-factory
  2.   (lambda (stx)
  3.  
  4.     (define (insert-identifiers . x*)
  5.       ;; Create a list of gensym-generated identifiers within the
  6.       ;; syntactic context. (This is not the same datum->syntax as
  7.       ;; that of R⁶RS, and this gensym is not the same as in the
  8.       ;; (chezscheme) library of Chez Scheme.)
  9.       (datum->syntax stx (map gensym x*)))
  10.  
  11.     (syntax-case stx ()
  12.       ((_ designation rule ...)
  13.        (syntax-case
  14.            (insert-identifiers
  15.             'original-constructor%
  16.             'constructor%
  17.             'original-predicate%
  18.             'predicate%
  19.             'fields%
  20.             'access%) ()
  21.          ((original-constructor%
  22.            constructor%
  23.            original-predicate%
  24.            predicate%
  25.            fields%
  26.            access%)
  27.           (syntax ;; Avoid #' because many readers cannot handle it.
  28.            (begin
  29.              (define-record-type designation
  30.                (original-constructor% fields%)
  31.                original-predicate%
  32.                (fields% access%))
  33.              (define (constructor% . obj)
  34.                (original-constructor% (list->vector obj)))
  35.              (define (predicate% obj)
  36.                (original-predicate% obj))
  37.              (define-syntax record-rule
  38.                (syntax-rules ( constructor>
  39.                                predicate>
  40.                                getter> setter> )
  41.  
  42.                  ((_ constructor predicate access (constructor> name proc))
  43.                   (define name (proc constructor)))
  44.  
  45.                  ((_ constructor predicate access (constructor> name))
  46.                   (define name constructor))
  47.  
  48.                  ((_ constructor predicate access (predicate> name proc))
  49.                   (define name (proc predicate)))
  50.  
  51.                  ((_ constructor predicate access (predicate> name))
  52.                   (define name predicate))
  53.  
  54.                  ((_ constructor predicate access (getter> i name))
  55.                   (define name
  56.                     (lambda (obj)
  57.                       (vector-ref (access obj) (- i 1)))))
  58.  
  59.                  ((_ constructor predicate access (setter> i name))
  60.                   (define name
  61.                     (lambda (obj value)
  62.                       (vector-set! (access obj) (- i 1) value))))))
  63.  
  64.              (record-rule constructor% predicate% access%
  65.                           rule)
  66.              ...))))))))
  67.  
Advertisement
Add Comment
Please, Sign In to add comment