Merhaba,

Şunu açıkça itiraf etmeliyim ki stream'ler şu ana kadar SICP'den öğrendiğim en 
inanılmaz yöntem oldu. Daha 3.5.1 bölümün başını okudum ve Eratosthenes Eleği 
(Sieve of Eratosthenes) algoritmasını öğrenmem ile "tüm asal sayıları 
hesaplayan" kodu yazmam bir oldu. (Bilmiyorum belki ileride egzersiz olarak 
verilmiştir bu problem, ama ben sonraki satırı okumaya bile sabredemedim.) 
Liste üyelerinin de ilgisini çekebileceğini düşündüm:

(define-syntax stream-cons
  (syntax-rules ()
   ((_ item stream) (cons item (delay stream)))))

(define stream-car car)
(define (stream-cdr stream) (force (cdr stream)))
(define stream-null '())
(define stream-null? null?)

(define (stream-filter pred s)
  (cond
   ((stream-null? s) stream-null)
   ((pred (stream-car s))
    (stream-cons (stream-car s)
                 (stream-filter pred (stream-cdr s))))
   (else (stream-filter pred (stream-cdr s)))))

(define (infinite-iota from)
  (stream-cons from (infinite-iota (+ from 1))))

(define primes-stream
  (let loop ((primes-lst (infinite-iota 2)))
    (let ((prime (stream-car primes-lst)))
      (stream-cons prime
                   (loop (stream-filter
                          (lambda (p) (not (= (remainder p prime) 0)))
                          (stream-cdr primes-lst))))))

Ne kadar asal sayı istiyorsanız hiç üşenmeden STREAM-CAR ve STREAM-CDR ile 
primes-stream'in içinden istediğiniz kadarını alın.

Stream'ler ile ucu açık listeler oluşturmak gerçekten inanılmaz bir silah. Ama 
bence birikimli (accumulative) programların iteratif olarak işlemesine de 
olanak sağlaması harika! Siz kodunuz iteratif mi oldu diye düşünmeden, 
bildiğiniz (cons (car lst) (loop (cdr lst))) ile babadan kalma birikimli 
yöntemlerinizi kullanmaya devam edebilirsiniz. Rekürsif çağrıların iteratif 
ilerlemesi stream'ler tarafından zaten hallediliyor olacak.

"Başka bir arzunuz?" sloganının bulunduğu reklam gerçekten Lisp ile ilgili 
değil miydi? Çok büyük kayıp olmuş. :-)

Unutmadan, bu arada [EMAIL PROTECTED]'tek tartışırken Eratosthenes Eleği ile 
ilgili şöyle şeylerden de bahsedildi:

18:29 <lisppaste> vy annotated #36101 with "a working primes stream" at 
http://paste.lisp.org/display/36101#1
18:29 <pjd_> yay
18:30 <vy> A "prime on demand" generated primes list. :)
18:30 <bsmntbombdood> fun
18:33 <gnomon>  vy, have you looked at Bengelloun's incremental linear prime 
number sieve?
...
18:36 <vy> gnomon: No :-( Let me check it!
18:36 <gnomon> ...right, two more seconds.
18:37 <pjd_> http://www.springerlink.com/index/U066R5H74R7432HN.pdf ?
18:37 <gnomon> OK, I can't access my high-quality scan of the article right now 
because of a faulty network connection, but fortunately djb's copy is still 
accessible: http://cr.yp.to/bib/1986/bengelloun.html
18:38 <gnomon> This is a truly pimptastic algorithm. If you really like it, I 
highly recommend reading Paul Pritchard's work on segmented wheel sieves.
18:39 <gnomon> There's also an excellent overview of more modern sifting 
techniques by Sorenson, Dunten and Jones out there. That one is easy to find.


İyi çalışmalar.

P.S. emacs ve Türkçe karakter ile ilgili soruya gelen cevaplar için teşekkür 
ederim. Şu an kendi bilgisayarımın başında olmadığım için önerileri deneme 
şansım olmadı. Hafta sonu o işe bakacağım. (Tabii ilk önce vm'e alışıp "dpkg 
--purge mutt" demezsem.)

_______________________________________________
cs-lisp mailing list
cs-lisp@cs.bilgi.edu.tr
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp

Cevap