Changeset 40249 in project


Ignore:
Timestamp:
07/02/21 20:50:44 (4 weeks ago)
Author:
Mario Domenech Goulart
Message:

define-record and srfi 17: adapt to CHICKEN 5

File:
1 edited

Legend:

Unmodified
Added
Removed
  • wiki/define-record and srfi 17

    r40239 r40249  
    1 '''WARNING''': this page is considered obsolete, as it contains information about old CHICKEN versions.
     1== define-record and srfi-17
    22
    3 Regular define-record records don't support generalized set. This macro implements support for binding to srfi-17.
     3Regular define-record records don't support generalized set.
     4This macro implements support for binding to srfi-17.
    45
    5  (define-syntax (define-gs-record x r c)
    6    (let ((type (cadr x))
    7          (fields (cddr x))
    8          (%begin (r 'begin))
    9          (%define-record (r 'define-record))
    10          (%define (r 'define))
    11          (%getter-with-setter (r 'getter-with-setter)))
    12      `(,%begin
    13        (,%define-record ,type ,@fields)
    14        ,@(map (lambda (f)
    15                 (let* ((getter (string->symbol
    16                                 (string-append
    17                                  (symbol->string
    18                                   (strip-syntax type))
    19                                  "-"
    20                                  (symbol->string
    21                                   (strip-syntax f)))))
    22                        (setter (string->symbol
    23                                 (string-append
    24                                  (symbol->string
    25                                   (strip-syntax getter))
    26                                  "-set!"))))
    27                   (list %define getter (list %getter-with-setter getter setter))))
    28               fields))))
    29  
    30 (define-gs-record test a b c)
     6<enscript highlight="scheme">
     7(define-syntax define-gs-record
     8  (er-macro-transformer
     9   (lambda (x r c)
     10     (let ((type (cadr x))
     11           (fields (cddr x))
     12           (%begin (r 'begin))
     13           (%define-record (r 'define-record))
     14           (%define (r 'define))
     15           (%getter-with-setter (r 'getter-with-setter)))
     16       `(,%begin
     17         (,%define-record ,type ,@fields)
     18         ,@(map (lambda (f)
     19                  (let* ((getter (string->symbol
     20                                  (string-append
     21                                   (symbol->string
     22                                    (strip-syntax type))
     23                                   "-"
     24                                   (symbol->string
     25                                    (strip-syntax f)))))
     26                         (setter (string->symbol
     27                                  (string-append
     28                                   (symbol->string
     29                                    (strip-syntax getter))
     30                                   "-set!"))))
     31                    (list %define
     32                          getter
     33                          (list %getter-with-setter getter setter))))
     34                fields))))))
     35</enscript>
     36
    3137
    3238now you can say
    3339
    34   (define t (make-test 1 2 3))
    35   (set! (test-a t) 'new-val)
     40<enscript highlight="scheme">
     41(define-gs-record test a b c)
     42
     43(define t (make-test 1 2 3))
     44(set! (test-a t) 'new-val)
     45</enscript>
Note: See TracChangeset for help on using the changeset viewer.