functional data structures? pasted by saeftl on Thu Sep 26 11:42:26 2013
(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"))
now with lists added by saeftl on Fri Sep 27 10:46:38 2013
(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 fassoc (fold-right add-entry empty (list '("bing" 1) '("bar" 2) '("foo" 3)))) (print (fassoc "bar")) (print (fassoc "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 "gibtsnet")) (define (n-times f n) (lambda (x) (fold (lambda (k acc) (f acc)) x (iota n)))) ;; XXX terminates with an error, not an empty list (define (end-of-list) (lambda (c) (c '() end-of-list))) (define (add-list-entry v f) (lambda () (lambda (c) (c v f)))) (define flist (fold-right add-list-entry end-of-list (list "bing" 2 "blah" 4 "end"))) (define (hd x y) x) (define (tl x y) y) (define (flist-ref fl n) ((((n-times (lambda (f) ((f) tl)) n) fl)) hd)) (print (flist-ref flist 0)) (print (flist-ref flist 3)) (print (flist-ref flist 4)) (print (flist-ref flist 9))