Skip to content

Instantly share code, notes, and snippets.

@Djexus
Created December 6, 2011 22:59
Show Gist options
  • Save Djexus/1440459 to your computer and use it in GitHub Desktop.
Save Djexus/1440459 to your computer and use it in GitHub Desktop.
Python's range object in Scheme
#lang racket
(define range
(case-lambda
((stop) (range 0 stop 1))
((start stop) (range start stop 1))
((start stop step) (list 'range start stop step))))
(define range?
(lambda (obj)
(eq? (car obj) 'range)))
(define range-start
(lambda (obj)
(car (cdr obj))))
(define range-stop
(lambda (obj)
(car (cdr (cdr obj)))))
(define range-step
(lambda (obj)
(car (cdr (cdr (cdr obj))))))
(define range-len
(lambda (obj)
(max 0 (ceiling (/ (- (range-stop obj) (range-start obj)) (range-step obj))))))
(define range-getitem
(lambda (obj index)
(if (not (< -1 index (range-len obj)))
null
(+ (range-start obj) (* index (range-step obj))))))))
(define range-iter
(lambda (obj)
(let ((index 0))
(lambda ()
(set! index (+ index 1))
(range-getitem obj (- index 1))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment