無限リスト(using 遅延評価)

流行っているようなので、誰かが手を出す前にSchemeで書いてみた。
id:namasute0のソースをそのまま写しただけで動いたよ。遅延評価がある言語は便利だな、と。

(define primes_from_2
  (cons 2 (delay (primes_from 3))))

(define (primes_from n)
  (if (is_prime n)
      (cons n (delay (primes_from (+ n 1))))
      (primes_from (+ n 1))))

(define (is_prime n)
  (define (iter n x)
    (define m (car x))
    (cond
     *1

印字してみる

(define (print_primes n x)
  (if (= n 0) '() (begin (display (car x)) (newline) (print_primes (- n 1) (force (cdr x))))))

*1:> (* m m) n) #t) (else (and (not (= 0 (remainder n m))) (iter n (force (cdr x))))))) (iter n primes_from_2