summaryrefslogtreecommitdiff
path: root/scheme/table.sls
blob: 55899e9e3b9b67475b12e00b08bc237dcdd72fcd (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
(library (table)
(export tbl table table-extend table-get)
(import (rnrs) (sweet-macros) (only (ikarus) gensym))

(def-syntax (tbl (name value) ...)
  #'(letrec ((name value) ...)
      (table (list (list 'name name) ...))))

(def-syntax (table-get t key else0 else1 ...)
  #'(let ((res (t key)))
      (if (missing-key? res)
          (begin else0 else1 ...)
          res)))

(define MISSING-KEY (gensym 'missing-key))

(define (missing-key? x)
  (eq? x MISSING-KEY))

(define append-unique append)

(define (table alist)
  (define full-list (append-unique (list (list '->alist alist)) alist))
  (lambda (k)
    (define ls (assq k full-list))
    (if ls (cadr ls) MISSING-KEY)))

(define (table-extend base-table ext)
  (table (append (base-table '->alist) ext)))

)