2013-11-26 32 views
5

Bu, SICP Book Chapter 3.5.2 ile ilgili bir sorudur.SICP Sonsuz Akışlar (Bölüm 3.5.2)

Diğer programlama dillerinde bir akış veri yapısı uyguluyorum. Ve şu snippet'i doğru anladığımdan emin değilim. Ben (cons-stream n (integers-starting-from (+ n 1)))) yürüterek bir değer döndürmek işlevini çalıştırır (integers-starting-from (+ n 1)) de anlaşıldığı kadarıyla

(define (integers-starting-from n) 
    (cons-stream n (integers-starting-from (+ n 1)))) 

(define integers (integers-starting-from 1)) 

. cons-stream'un ikinci resmi parametresi (integers-starting-from (+ n 1)) olduğundan ve () tarafından eklendiği için, yürütmeyi geciktirmek yerine işlevi tekrar tekrar ve tekrar yürütecektir.

Bu parçacığı uygulamadan önce gördüğüm kadarıyla, aşağıdaki tamsayı yürütülecek akışın saniye öğesinden önce sonsuz bir özyinelemeye yol açacaktır.

Neden bu, lecture sırasında gösterildiği gibi şema için çalışıyor gibi görünüyor? Gönderen

benim o artık şöyle bir şey yazılmalıdır anlama:

(define (integers-starting-from n) 
    (cons-stream n (lambda() (integers-starting-from (+ n 1))))) 

(define integers (integers-starting-from 1)) 

bu şema (integers-starting-from (+ n 1)) yerine getirilmesini geciktiremez büyü türlü sahip olduğu anlamına gelir mi?

+1

Biraz farklı bir akış stilinin uygulanması için, [blogum] 'da da görebileceğiniz [SRFI-41] (http://srfi.schemers.org/srfi-41/) sayfasına bakın. /programmingpraxis.com/essays/#srfi41streams). Belgede "cons-stream" in uygulanışı ayrıntılı olarak açıklanmaktadır. – user448810

cevap

8

hüner biz cons-stream nasıl uyguladıklarını yatıyor şimdiden teşekkürler. (lambda() ...) thunk öğesini tanımladığınızda açıkça bir değerlendirme sözü oluşturdunuz. Özel form cons-stream bunu yapar, ancak örtülü olarak ve Scheme'nin temel öğelerini kullanır. Örneğin, bu gibi uygulanabilir, biz delay nasıl kullandıklarını fark: Tek bir yerde tüm vaadi oluşturma mantığını daha mantıklı

(define-syntax stream-cons 
    (syntax-rules() 
    ((stream-cons head tail) 
    (cons head (delay tail))))) 

, açıkça her yerde Thunks yaratma yerine, cons-stream söylüyorlar.