fork download
  1. ; find the nearest prime
  2.  
  3. (define (primes n)
  4. (let ((sieve (make-vector n #t)) (ps (list)))
  5. (do ((p 2 (+ p 1))) ((= n p))
  6. (when (vector-ref sieve p)
  7. (set! ps (cons p ps))
  8. (do ((i (* p p) (+ i p))) ((<= n i))
  9. (vector-set! sieve i #f))))
  10. (list->vector (reverse ps))))
  11.  
  12. (define ps (primes 542))
  13.  
  14. (define (bsearch x xs)
  15. (let loop ((lo 0) (hi (- (vector-length xs) 1)))
  16. (let ((mid (+ lo (quotient (- hi lo) 2))))
  17. (cond ((< hi lo)
  18. (if (< (- (vector-ref xs hi) x)
  19. (- x (vector-ref xs lo)))
  20. (vector-ref xs lo)
  21. (vector-ref xs hi)))
  22. ((< x (vector-ref xs mid)) (loop lo (- mid 1)))
  23. ((< (vector-ref xs mid) x) (loop (+ mid 1) hi))
  24. (else (vector-ref xs mid))))))
  25.  
  26. (define (find-prime x) (bsearch x ps))
  27.  
  28. (display (find-prime 123.7)) (newline)
  29. (display (find-prime 4)) (newline)
Success #stdin #stdout 0.02s 42848KB
stdin
Standard input is empty
stdout
127
3