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
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp