(use srfi-1) (use srfi-13) (define (empty k) 'no-such-entry) (define (add-entry kv f) (let ((k (car kv)) (v (cadr kv))) (lambda (kp) (if (equal? kp k) v (f kp))))) (define flist (fold-right add-entry empty (list '("bing" 1) '("bar" 2) '("foo" 3)))) (print (flist "bar")) (print (flist "unknown key")) (define (add-tree-entry kv f g) (let ((k (car kv)) (v (cadr kv))) (lambda (kp) (cond ((equal? kp k) v) ((string< kp k) (f kp)) ((string> kp k) (g kp)))))) (define ftree (add-tree-entry '("bar" 2) (add-tree-entry '("bab" 1) empty empty) (add-tree-entry '("foo" 0) (add-tree-entry '("ddd" 1234) empty empty) (add-tree-entry '("zoing" 4) empty empty)))) (print (ftree "ddd")) (print (ftree "zoing")) (print (ftree "nonsuch"))