; lucky numbers
(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 (del xs k)
(let loop ((i 1) (xs xs) (zs (list)))
(if (null? xs) (reverse zs)
(if (zero? (modulo i k))
(loop (+ i 1) (cdr xs) zs)
(loop (+ i 1) (cdr xs) (cons (car xs) zs))))))
(define (lucky n)
(let loop ((i 1) (sieve (range 1 n 2)))
(let ((p (list-ref sieve i)))
(if (< (length sieve) p) sieve
(loop (+ i 1) (del sieve p))))))
(display (lucky 304))