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))