計算機プログラムの構造と解釈 第二版 P29 問題1.22

こんな感じ。

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(use ggc.debug.trace)

;;runtime;;;;;;;;;;;;;;;;;;;;;;
(define (runtime)
  (use srfi-11)
  (let-values (((a b) (sys-gettimeofday)))
              (+ 1000000 b)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;1-21;;;;;;;;;;;;;;;;;;;;;;;;;
(define (square n)
  (* n n))


(define (smallest-divisor n)
  (find-divisor n 2))

(define (find-divisor n test-divisor)
  (cond ((> (square test-divisor) n) n)
        ((divides?  test-divisor n) test-divisor)
        (else (find-divisor n
                            (+ test-divisor 1)))))


(define (divides? a b)
  (= (remainder b a) 0))

(define (prime? n)
  (= n (smallest-divisor n)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define (timed-prime-test n)
  (newline)
  (display n)
  (start-prime-test n (runtime)))

(define (start-prime-test n start-time)
  (if (prime? n)
    (report-prime (- (runtime) start-time))))

(define (report-prime elapsed-time)
  (display " *** ")
  (display elapsed-time))

(define (search-for-primes-iter num counter)
(cond ((= counter 3))
      ((prime? num) (print num) (search-for-primes-iter (+ num 2) (+ counter 1)))
      (else (search-for-primes-iter (+ num 2) counter))))


(define (search-for-primes num)
  (cond ((divides? 2 num) (search-for-primes-iter (+ num 1) 0))
        (else (search-for-primes-iter num 0))))

;; main
(define (main args)
   (search-for-primes 1000)
   (search-for-primes 10000)
   (search-for-primes 100000)
   (search-for-primes 1000000)
   (timed-prime-test 1009)
   (timed-prime-test 1013)
   (timed-prime-test 1019)
   (timed-prime-test 10007)
   (timed-prime-test 10009)
   (timed-prime-test 10037)
   (timed-prime-test 100003)
   (timed-prime-test 100019)
   (timed-prime-test 100043)
   (timed-prime-test 1000003)
   (timed-prime-test 1000033)
   (timed-prime-test 1000037)(newline)
 0)