File tree Expand file tree Collapse file tree 2 files changed +83
-0
lines changed
Expand file tree Collapse file tree 2 files changed +83
-0
lines changed Original file line number Diff line number Diff line change 1+ #lang racket
2+
3+ (define (make-table)
4+ (mcons '*table* '() ))
5+
6+ (define (assoc key records)
7+ (cond ((null? records) false )
8+ ((equal? key (mcar (mcar records)))
9+ (mcar records))
10+ (else (assoc key (mcdr records)))))
11+
12+ ;;; O(N)
13+ (define (lookup key table)
14+ (let ((record (assoc key (mcdr table))))
15+ (if record
16+ (mcdr record)
17+ false )))
18+
19+ (define (insert! key value table)
20+ (let ((record (assoc key (mcdr table))))
21+ (if record
22+ (set-mcdr! record value)
23+ (set-mcdr! table (mcons (mcons key value) (mcdr table)))))
24+ 'ok )
25+
26+ (module+ test
27+ (require rackunit)
28+
29+ (test-case "Test for 1 dimensional table "
30+ (define 1dt (make-table))
31+ (check-false (lookup 'no-exist-key 1dt))
32+ (insert! 'name 'Jon 1dt)
33+ (check-equal? (lookup 'name 1dt) 'Jon )
34+ )
35+ )
36+ (provide make-table insert! lookup assoc)
Original file line number Diff line number Diff line change 1+ #lang racket
2+ (require "1d-table.rkt " )
3+
4+ (define (make-table)
5+ (let ((local-table (mcons '*table* '() )))
6+ (define (lookup key-1 key-2)
7+ (let ((subtable (assoc key-1 (mcdr local-table))))
8+ (if subtable
9+ (let ((record (assoc key-2 (mcdr subtable))))
10+ (if record
11+ (mcdr record)
12+ false ))
13+ false )))
14+
15+ (define (insert! key-1 key-2 value)
16+ (let ((subtable (assoc key-1 (mcdr local-table))))
17+ (if subtable
18+ (let ((record (assoc key-2 (mcdr subtable))))
19+ (if record
20+ (set-mcdr! record value)
21+ (set-mcdr! subtable (mcons (mcons key-2 value)
22+ (mcdr subtable)))))
23+ (set-mcdr! local-table (mcons
24+ (mcons key-1
25+ (mcons (mcons key-2 value) '() ))
26+ (mcdr local-table)))))
27+ 'ok )
28+ (define (dispatch m)
29+ (cond ((eq? m 'lookup-proc ) lookup)
30+ ((eq? m 'insert-proc! ) insert!)
31+ (else (error "Unknown Operation -- TABLE " m))))
32+ dispatch))
33+
34+
35+ (module+ test
36+ (require rackunit)
37+
38+ (test-case "Test for 2d table "
39+ (define operation-table (make-table))
40+ (define get (operation-table 'lookup-proc ))
41+ (define put (operation-table 'insert-proc! ))
42+ (check-false (get 'math '+ ))
43+ (put 'math '+ 43 )
44+ (check-false (get 'math '* ))
45+ (check-equal? (get 'math '+ ) 43 )
46+ )
47+ )
You can’t perform that action at this time.
0 commit comments