1 ;; (*tbl* (k1 v1) (k2 v2) ...)
6 ;; the val for key (#f if none)
7 (define (tbl-get tbl key)
8 (let ((kvpair (assoc key (cdr tbl))))
13 ;; add key/val or replace the current val of key
14 (define (tbl-set! tbl key val)
15 (let ((kvpair (assoc key (cdr tbl))))
17 (set-cdr! kvpair (list val))
19 (cons (cons key (list val))
22 ;; append val to the value of key;
23 ;; if key is not there make a new list with just val
24 ;; if current value is not a list, converts it to a list first
25 (define (tbl-append! tbl key val)
26 (let ((entry (assoc key (cdr tbl))))
27 (cond ((or (not entry)
28 (not (pair? (cdr entry))))
29 (tbl-set! tbl key (list val)))
30 ((not (pair? (cadr entry)))
31 (set-cdr! entry (list (cons val (cdr entry)))))
33 (set-cdr! entry (list (cons val (cadr entry))))))))
35 ;; run a procedure on each value in the table
36 (define (tbl-for-each-val fx tbl)
37 (for-each (lambda (entry)
38 (println "tbl-for-each-val:entry=" entry)
39 (println "cdr=" (cdr entry))
40 (apply fx (cdr entry)))
43 ;; remove the entry that matches key
44 (define (tbl-rm! tbl key)
46 (if (equal? key (caadr tbl))
47 (set-cdr! tbl (cddr tbl))
48 (tbl-rm! (cdr tbl) key))))
50 ;; set table values from name/value list
51 (define (tbl-set-all! tbl entrydata)
52 (if (not (null? entrydata))
54 (tbl-set! tbl (car entrydata) (car (cdr entrydata)))
55 (tbl-set-all! tbl (cddr entrydata))
59 (define (tbl-build . entrydata)
61 (tbl-set-all! tbl entrydata)
67 (equal? (car tbl) '*tbl*)