Project:
programmingpraxis
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,2,3,4,5,6,9,13,14,15,16,17,18,19
|
|