;; - Function: unfold p f g seed &optional tail-gen ;; [SRFI-1] Fundamental recursive list constructor. Defined by the ;; following recursion. ;; ;; (unfold p f g seed tail-gen) == ;; (if (p seed) ;; (tail-gen seed) ;; (cons (f seed) ;; (unfold p f g (g seed)))) ;; That is, P determines where to stop, G is used to generate ;; successive seed value from the current seed value, and F is used ;; to map each seed value to a list element. (use srfi-1) (define (add1 n) (+ n 1)) (define (natural-numbers-to n) (unfold (cut = <> n) identity add1 0)) (define (make-adders n) (unfold (cut = <> n) (lambda (i) (cut + <> i)) add1 0)) ;; haskell ;; makeAdders n = map (+) [1..n] ;; or in Scheme (using the fairly common "curry" and srfi-1's "iota"): (define (make-adders n) (map (curry +) (iota n 1))) (print (unfold (lambda (value) ; stop condition (> value 10)) (lambda (value) ; mapping function (* value value)) (lambda (value) ; next value generator (+ value 1)) 0 ; start value (lambda (value) ; finaliser ())))