計算機プログラムの構造と解釈 第二版 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)