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 25
25
习题完成情况:
26
26
- 章节一: 43/46
27
27
- 章节二: 88/97
28
- - 章节三: 24 /82
28
+ - 章节三: 25 /82
29
29
- 章节四: TODO
30
30
- 章节五: TODO
31
31
* 运行
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