Skip to content

Instantly share code, notes, and snippets.

@sbstp
Created November 22, 2015 04:56
Show Gist options
  • Save sbstp/0a605e7000347c407693 to your computer and use it in GitHub Desktop.
Save sbstp/0a605e7000347c407693 to your computer and use it in GitHub Desktop.
; create iterator from list
(define (iter lst)
(define state lst)
(lambda ()
(if (null? state)
'()
(let ((v (car state)))
(set! state (cdr state))
v))))
; map over iterator
(define (map f it)
(lambda ()
(let ((v (it)))
(if (null? v)
'()
(f v)))))
; skip the first n elements
(define (skip n it)
(define i 0)
(define (loop)
(if (< i n)
(begin
(set! i (+ i 1))
(it)
(loop))))
(lambda ()
(if (= i 0)
(loop))
(it)))
; take a fixed amount of values
(define (take n it)
(define i 0)
(lambda ()
(if (>= i n)
'()
(begin
(set! i (+ i 1))
(it)))))
; collect the values
(define (collect it)
(define (loop lst)
(let ((v (it)))
(if (null? v)
lst
(loop (append lst (list v))))))
(loop '()))
; example
; from '(1 2 3 4 5 6), skip 2, take 3, map, square, collect
; '(16 25)
(collect (map (lambda (n) (* n n)) (take 2 (skip 3 (iter '(1 2 3 4 5 6))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment