[ create a new paste ] login | about

Project: programmingpraxis
Link: http://programmingpraxis.codepad.org/5rArlKwi    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on Jun 22:
; the mod out system

(define (range . args)
  (case (length args)
    ((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
    ((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
    ((3) (let ((le? (if (negative? (caddr args)) >= <=)))
           (let loop ((x(car args)) (xs '()))
             (if (le? (cadr args) x)
                 (reverse xs)
                 (loop (+ x (caddr args)) (cons x xs))))))
    (else (error 'range "unrecognized arguments"))))

(define (string-split sep str)
  (define (f cs xs) (cons (list->string (reverse cs)) xs))
  (let loop ((ss (string->list str)) (cs '()) (xs '()))
    (cond ((null? ss) (reverse (if (null? cs) xs (f cs xs))))
          ((char=? (car ss) sep) (loop (cdr ss) '() (f cs xs)))
          (else (loop (cdr ss) (cons (car ss) cs) xs)))))

(define (string-join sep ss)
  (define (f s ss)
    (string-append s (string sep) ss))
  (define (join ss)
    (if (null? (cdr ss)) (car ss)
      (f (car ss) (join (cdr ss)))))
  (if (null? ss) "" (join ss)))

(define (make-range s)
  (if (not (member #\- (string->list s))) s
    (let ((ab (string-split #\- s)))
      (string-join #\,
        (map number->string
          (range (string->number (car ab))
                 (+ (string->number (cadr ab)) 1)))))))

(define (mod-out str)
  (string-join #\, (map make-range (string-split #\, str))))

(display (mod-out "1-6,9,13-19"))


Output:
1
1,2,3,4,5,6,9,13,14,15,16,17,18,19


Create a new paste based on this one


Comments: