2 (defun make-leaf (symbol weight)
3 (list 'leaf sym weight))
10 (defun make-code-tree (left right)
13 (append (symbols left) (symbols right))
14 (+ (weight left) (weight right))))
15 (defun left-branch (tree)
17 (defun right-branch (tree)
21 (list (symbol-leaf tree))
27 (defun adjoin-set (x set)
28 "Add a new element _x_ into a set of elements, sorted by weight"
29 (cond ((null set) (list x))
30 ((< (weight x) (weight (car set)))
33 (adjoin-set x (cdr set))))))
34 (defun make-leaf-set (pairs)
37 (let ((pair (car pairs)))
38 (adjoin-set (make-leaf (car pair)
40 (make-leaf-set (cdr pairs))))))
41 (defun decode (bits tree)
42 (labels ((decode-1 (bits branch)
45 (let ((next-branch (choose-branch (car bits) branch)))
46 (if (leaf? next-branch)
47 (cons (symbol-leaf next-branch)
48 (decode-1 (cdr bits) tree))
49 (decode-1 (cdr bits) next-branch))))))
50 (decode-1 bits tree)))
51 (defun choose-branch (bit branch)
52 (cond ((= bit 0) (left-branch branch))
53 ((= bit 1) (right-branch branch))
54 (t (error "bad bit -- CHOOSE-BRANCH ~A" bit))))
64 (defvar sample-message '(0 1 1 0 0 1 0 1 0 1 1 1 0))
66 (defun encode-symbol (sym tree)
67 (labels ((tree-walk (sym node encoding)
71 ((element-of-set? sym (symbols (left-branch node)))
72 (tree-walk sym (left-branch node) (cons 0 encoding)))
73 ((element-of-set? sym (symbols (right-branch node)))
74 (tree-walk sym (right-branch node) (cons 1 encoding)))
75 (t (error "Symbol not in tree -- ~A" sym))))))
76 (reverse (tree-walk sym tree '()))))