Skip to content

Commit 0362825

Browse files
committed
Add solution for exercise3-25
1 parent 5f088a0 commit 0362825

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

README.org

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
习题完成情况:
2626
- 章节一: 43/46
2727
- 章节二: 88/97
28-
- 章节三: 24/82
28+
- 章节三: 25/82
2929
- 章节四: TODO
3030
- 章节五: TODO
3131
* 运行

chapter3/exercise3-25.rkt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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+
)

0 commit comments

Comments
 (0)