diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2023-06-23 17:40:04 +0200 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2023-06-23 17:40:04 +0200 |
| commit | b0436b07fa1efbbbc89769fed15039c97b368ea7 (patch) | |
| tree | d403b158b1ead768187ff6b4afaa5596f272a817 /shared/table.rkt | |
| parent | 65304e67abae760bc0839189af254bf8578f5411 (diff) | |
section 3.3 done
Diffstat (limited to 'shared/table.rkt')
| -rw-r--r-- | shared/table.rkt | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/shared/table.rkt b/shared/table.rkt new file mode 100644 index 0000000..be4155e --- /dev/null +++ b/shared/table.rkt @@ -0,0 +1,37 @@ +#lang racket +(require compatibility/mlist) + +(define (make-table same-key?) + (let ((local-table (mlist '*table*))) + (define (assoc key records) + (cond ((null? records) false) + ((same-key? key (mcar (mcar records))) (mcar records)) + (else (assoc key (mcdr records))))) + (define (lookup key-1 key-2) + (let ((subtable (assoc key-1 (mcdr local-table)))) + (if subtable + (let ((record (assoc key-2 (mcdr subtable)))) + (if record + (mcdr record) + false)) + false))) + (define (insert! key-1 key-2 value) + (let ((subtable (assoc key-1 (mcdr local-table)))) + (if subtable + (let ((record (assoc key-2 (mcdr subtable)))) + (if record + (set-mcdr! record value) + (set-mcdr! subtable + (mcons (mcons key-2 value) + (mcdr subtable))))) + (set-mcdr! local-table + (mcons (mlist key-1 (mcons key-2 value)) (mcdr local-table))))) + 'ok) + (define (dispatch m) + (cond ((eq? m 'lookup-proc) lookup) + ((eq? m 'insert-proc) insert!) + (else (error "Unknown operation -- TABLE" m)))) + dispatch)) +(define tbl (make-table (lambda (a b) (equal? a b)))) +((tbl 'insert-proc) 'test 'message "hi") +((tbl 'lookup-proc) 'test 'message) |
