summaryrefslogtreecommitdiff
path: root/strigoform/type.scm
blob: efd4287b4954b4ec766310c24000346f1222741f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
(library (strigoform type)
  (export define-type)
  (import (scheme base)
          (hoot match)
          (only (hoot syntax) define-syntax-rule))

  ;; Record types are only just beginning to be added to Hoot and
  ;; there isn't support for mutable structs, yet. So, tagged
  ;; vectors will have to do.
  (define-syntax-rule (define-type name
                        constructor
                        predicate
                        (field getter setter) ...)
    (begin
      (define (constructor field ...)
        (vector 'name field ...))
      (define (predicate obj)
        (match obj
          (#('name field ...) #t)
          (_ #f)))
      (define (getter obj)
        (match obj
          (#('name field ...)
           field)))
      ...
      (define setter
        (let ((i (+ (- (length '(field ...))
                       (length (memq 'field '(field ...))))
                    1)))
          (lambda (obj val)
            (match obj
              (#('name field ...)
               (vector-set! obj i val))))))
      ...)))