2013-11-26 3 views
5

이것은 SICP Book Chapter 3.5.2과 관련된 질문입니다.SICP 무한 스트림 (3.5.2 장)

다른 프로그래밍 언어로 스트림 데이터 구조를 구현하고 있습니다. 그리고 다음 스 니펫을 올바르게 이해하는지 잘 모르겠습니다. I는 (cons-stream n (integers-starting-from (+ n 1))))을 실행하여 값을 반환하는 함수를 실행 (integers-starting-from (+ n 1))에서 이해 한 것과

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

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

. cons-stream의 두 번째 형식 매개 변수는 (integers-starting-from (+ n 1))이고 ()으로 묶여 있기 때문에 실행을 지연하는 대신 무한히 다시 함수를 실행합니다.

이 스 니펫을 실행하기 전에 알 수 있듯이 다음 정수는 실행중인 스트림의 초 요소보다 훨씬 이전에 무한 재귀 적으로 연결됩니다.

lecture에 표시된 것과 같이이 방식이 작동하는 이유는 무엇입니까? 에서

내가이 대신 같은 것을 작성해야 이해 :

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

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

이이 방식은 (integers-starting-from (+ n 1))의 실행을 지연 마법의 몇 가지 종류가 있음을 의미합니까?

+1

다소 다른 스타일의 스트림을 구현하려면 [SRFI-41] (http://srfi.schemers.org/srfi-41/)을 참조하십시오.이 내용은 [내 블로그] (http : /programmingpraxis.com/essays/#srfi41streams). 이 문서는'cons-stream' 구현을 자세히 설명합니다. – user448810

답변

8

트릭은 우리가 cons-stream을 구현하는 방법에 달려 사전에 감사합니다. (lambda() ...) 썽크를 정의 할 때 명시 적으로 평가 약속을 만들었습니다. 특별한 형식 cons-stream은 이것을하지만, Scheme의 프리미티브를 함축적으로 사용한다. 예를 들어,이 다음과 같이 구현 될 수있다, 우리는 delay을 사용하는 방법주의 사항 : 그것은 한 곳에서 모든 약속 - 생성 로직을 캡슐화하는 더 의미

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

, 명시 적으로 모든 곳에서 썽크를 만드는 대신, cons-stream을 말한다.