File tree Expand file tree Collapse file tree 2 files changed +52
-1
lines changed
Expand file tree Collapse file tree 2 files changed +52
-1
lines changed Original file line number Diff line number Diff line change 2525 习题完成情况:
2626 - 章节一: 43/46
2727 - 章节二: 88/97
28- - 章节三: 24 /82
28+ - 章节三: 25 /82
2929 - 章节四: TODO
3030 - 章节五: TODO
3131* 运行
Original file line number Diff line number Diff line change 1+ #lang racket
2+
3+ ;;; 实现与一维数组一致,差别在于 key 的表达方式,与原来使用 'a 的字符
4+ ;;; 变量作为 key 不同,现在使用 '(a b) 列表作为 key
5+ (define (make-table)
6+ (let ((local-table (mcons '*table* '() )))
7+ (define (assoc key records)
8+ (cond ((null? records) false )
9+ ((equal? key (mcar (mcar records)))
10+ (mcar records))
11+ (else (assoc key (mcdr records)))))
12+
13+ ;;; O(N)
14+ (define (lookup key)
15+ (let ((record (assoc key (mcdr local-table))))
16+ (if record
17+ (mcdr record)
18+ false )))
19+
20+ (define (insert! key value)
21+ (let ((record (assoc key (mcdr local-table))))
22+ (if record
23+ (set-mcdr! record value)
24+ (set-mcdr! local-table (mcons (mcons key value) (mcdr local-table)))))
25+ 'ok )
26+
27+ (define (dispatch m)
28+ (cond ((eq? m 'lookup-proc ) lookup)
29+ ((eq? m 'insert-proc! ) insert!)
30+ (else (error "Unknown operation -- TABLE " m)))
31+ )
32+ dispatch
33+ ))
34+
35+ (module+ test
36+ (require rackunit)
37+ (define op-table (make-table))
38+ (define get (op-table 'lookup-proc ))
39+ (define put (op-table 'insert-proc! ))
40+
41+ (test-case "Test for 1-dimentional table "
42+ (put '(name) 'Alice )
43+ (check-false (get '(no-exist)))
44+ (check-equal? (get '(name)) 'Alice )
45+ (put '(name age) 'Bob )
46+ (check-equal? (get '(name age)) 'Bob )
47+ (check-false (get '(age name)))
48+ (put '(a b c) 'val-abc )
49+ (check-equal? (get '(a b c)) 'val-abc )
50+ )
51+ )
You can’t perform that action at this time.
0 commit comments