���ä����Ȥ�, �¤Ӥ�ꥹ�Ȥ�ɽ��������, ����ͥ�����Ϸ���ɬ�פȤ�����ȶ��֤˴ؤ��Ƥθ��������Ψ������Ȥ��������Ƥ���. �¤Ӥ�����ꥹ�Ȥ��Ѵ��Ȥ���ɽ�������, �ץ������Ͻ����γƥ��ƥåפ�(����ˤʤꤽ����)�ǡ�����¤������, ʣ�̤��ʤ���Фʤ�ʤ�.
�ʤ����줬�����ʤΤ��뤿��, �����֤��ǿ������¤��������ĤΥץ���������٤褦. ���Υץ�������ɸ��Ūȿ���η��ǽƤ���:53
(define (sum-primes a b) (define (iter count accum) (cond ((> count b) accum) ((prime? count) (iter (+ count 1) (+ count accum))) (else (iter (+ count 1) accum)))) (iter a 0))����Υץ�������2.2.3����¤Ӥα黻��Ȥä�Ʊ������Ԥ�:
(define (sum-primes a b) (accumulate + 0 (filter prime? (enumerate-interval a b))))
����¹Ԥ���Τ�, ���Υץ����������Ѥ����פ��Ǽ���뵭����������ɬ�פȤ���. ������Ф�, ����Υץ������Υե��륿��, enumerate-interval�������ο��δ����ʥꥹ�Ȥ�������ޤǤ�, ���⤹�뤳�Ȥ�����ʤ�. �ե��륿��, �⤦��ĤΥꥹ�Ȥ���������. ���ˤ��Υꥹ�Ȥ�, ���¤��ä��٤��������accumulate���Ϥ����. ���������礭����ֵ��������Υץ������Ǥ�ɬ�פʤ��ä�. �����Ǥ϶�֤�缡�˿����夲, �ǿ�������������٤ˤ�������¤����Ƥ���ȻפäƤ���.
�ꥹ�Ȥ�Ȥ����Ψ��, ��
(car (cdr (filter prime? (enumerate-interval 10000 1000000))))��ɾ������10,000����1,000,000�ޤǤζ�֤������ܤ��ǿ�������褦�Ȥ���Τ��¤ӤΥѥ�������Ȥ��ȶ줷���ޤǤ����餫�ˤʤ�. ���μ���������ǿ��Ĥ��Ϥ��뤬, ���Υ����С��إåɤ�ˡ���ʤ�ΤȤʤ�. �ؤ��ɴ���Ĥ������Υꥹ�Ȥ���, �����Ǥ��ǿ�����ƥ��Ȥ��ƥꥹ�Ȥ�ե��륿��, ���η�̤��ؤ�ɤ��٤Ƥ�̵�뤹��. �������Ū�ʥץ�����ߥ�ή���Ǥ�, �����夲�ȥե��륿���礻, ������ǿ���ã����������ߤ���.
���ȥ����¤Ӥ�ꥹ�ȤȤ������륳���Ȥ��餦���Ȥʤ�, �¤Ӥ�����Ȥ碌�븭������ˡ�Ǥ���. ���ȥ�ब�����, ��Ĥ������Τ褤�꤬������: �������¤Ӥ����Ȥ��ƥץ�������ͥ���˷�������, ����������Ū���θ�Ψ���ݤ�. ���ܤιͤ��ϥ��ȥ�����ʬŪ�˹�������褦�ˤ�, ������ʬŪ������, ���ȥ������ץ��������Ϥ��ΤǤ���. ����¦���ޤ���������Ƥ��ʤ����ȥ�����ʬ�˥����������褦�Ȥ����, ���ȥ����ᤵ�줿��ʬ����٤�, ��ʬ�Τ⤦������ʬ�ʤ�����ưŪ�˹�����, ���ȥ�����Τ�¸�ߤ��뤫�Τ褦�ʸ��ۤ��ݤ�. �̤Τ������Ǥ�, �����ϴ������¤Ӥ�������Ƥ��뤫�Τ褦�˥ץ��������, ���ȥ��ι����Ȼ��Ѥ���ưŪ����Ʃ���˺�����礦�褦���ȥ��μ������߷פ���.
ɽ��Ū�ˤϥ��ȥ��Ϥ���������³����, �ۤ�̾�����Ĥ��Ƥ���ꥹ�ȤǤ���. ������cons-stream����Ĥ������
stream-car��
stream-cdr������, ����
(stream-car (cons-stream x y)) = x
(stream-cdr (cons-stream x y)) = y
������. ¾�ȶ��̽���륪�֥�������
the-empty-stream������, �����cons-stream�黻�η�̤Ȥʤ餺, �Ҹ�
stream-null?�Ǽ��̤����.54
���ä��¤ӤȤ������֤��줿�ǡ����ν����ɽ������Τ˥ꥹ�Ȥ���, �Ȥ��Τ�Ʊ�ͤ�, ���ȥ�����, �Ȥ����Ȥ������. �ä�list-ref, map�����for-each�Τ褦��, 2�ϤΥꥹ�ȱ黻�Υ��ȥ���Ǥ��뤳�Ȥ������:55
(define (stream-ref s n) (if (= n 0) (stream-car s) (stream-ref (stream-cdr s) (- n 1)))) (define (stream-map proc s) (if (stream-null? s) the-empty-stream (cons-stream (proc (stream-car s)) (stream-map proc (stream-cdr s))))) (define (stream-for-each proc s) (if (stream-null? s) 'done (begin (proc (stream-car s)) (stream-for-each proc (stream-cdr s)))))stream-for-each�ϥ��ȥ���į���Τ������Ǥ���:
(define (display-stream s) (stream-for-each display-line s)) (define (display-line x) (newline) (display x))
���ȥ��ι����Ȼ��Ѥ���ưŪ����Ʃ���˺�����礦�褦�˥��ȥ���������뤿��ˤ�, cons-stream�ǥ��ȥ�ब�������줿���ǤϤʤ�, stream-cdr��³���ǥ����������줿���˥��ȥ���cdr��ɾ�������褦�ˤ���. ���μ����������, 2.1.2���ͭ����������פ���������. �����Ǥ�����ͭ�����μ�����, ʬ�Ҥ�ʬ��δ���ޤǤδ����, ��������������Τɤ���Ǽ¹Ԥ��뤫���֤��Ȥ������Τ�. ͭ������ξ���μ�����, Ʊ���ǡ�����¤�������뤬, �������ϸ�Ψ�˱ƶ�����. ���ȥ����̾�Υꥹ�Ȥδ֤ˤ�Ʊ�ͤδط�������. �ǡ�����ݤȤ��Ƥϥ��ȥ��ϥꥹ�Ȥ�Ʊ���Ǥ���. �㤤�����Ǥ�ɾ���������Ǥ���. �̾�Υꥹ�ȤǤ�car ��cdr�϶��˹�������ɾ�������. ���ȥ��Ǥ�cdr���������ɾ�������.
�����Υ��ȥ��μ�����delay�Ȥ����ü������Ȥ�. (delay 〈exp〉)��ɾ���ϼ�〈exp〉��ɾ������, ������ �ٱ䥪�֥�������(delayed object)���֤�. ����Ͼ��褢�������〈exp〉��ɾ���������«�פȹͤ��뤳�Ȥ������. delay����֤�, �����Ȥ����ٱ䥪�֥������Ȥ�Ȥ�, ����ɾ����¹Ԥ��� force�Ȥ�����³��������. ---���̤Ȥ��Ƥ�delay����«��̤�����. delay��force��ɤ��������뤫�ϸ�Ǹ��뤳�Ȥˤ�, �ޤ�������Ȥäƥ��ȥ��������褦.
(cons-stream 〈a〉 〈b〉)��
(cons 〈a〉 (delay 〈b〉))�������ˤʤ�褦������줿�ü�����Ǥ���. ���ΰ�̣�ϥ��ȥ����Ф�Ȥäƹ�������Ȥ������ȤǤ���. ���������ȥ��λĤ���ͤ��Ф�cdr ���֤��ΤǤϤʤ�, ���줬�ᤵ�줿��Ĥ���������«���֤��ΤǤ���. stream-car��stream-cdr�ϼ�³��:
(define (stream-car stream) (car stream)) (define (stream-cdr stream) (force (cdr stream)))����������. stream-car���Ф�car������; stream-cdr���Ф�cdr������, �����Ǹ��Ĥ����ٱ估��ɾ�����ƥ��ȥ��λĤ������.56
(stream-car (stream-cdr (stream-filter prime? (stream-enumerate-interval 10000 1000000))))���줬��ΨŪ��Ư�����Ȥ褦.
stream-enumerate-interval�����10,000��1,000,000�ǸƤӽФ��ƻϤ��. stream-enumerate-interval��enumerate-interval�Υ��ȥ���ǤǤ���(2.2.3�Ỳ��):
(define (stream-enumerate-interval low high) (if (> low high) the-empty-stream (cons-stream low (stream-enumerate-interval (+ low 1) high))))������cons-stream�Ǻ��줿, stream-enumerate-interval���֤��ͤ�
(cons 10000 (delay (stream-enumerate-interval 10001 1000000)))�Ǥ���.57 �Ĥޤ�stream-enumerate-interval��car��10,000��, cdr�������ж�֤˿����夲����«�Ǥ����ФȤ���ɽ������Ƥ��륹�ȥ����֤�. ���Υ��ȥ���filter��³��(2.2.3��)�Υ��ȥ���Ǥ�Ȥ�, �ǿ����Υե��륿�ˤ�������:
(define (stream-filter pred stream) (cond ((stream-null? stream) the-empty-stream) ((pred (stream-car stream)) (cons-stream (stream-car stream) (stream-filter pred (stream-cdr stream)))) (else (stream-filter pred (stream-cdr stream)))))stream-filter�ϥ��ȥ���stream-car(�Ф�car��10,000)��ƥ��Ȥ��뤬, �ǿ��Ǥʤ�����, stream-filter�����ϥ��ȥ���stream-cdr��Ĵ�٤�. stream-cdr�θƽФ����ٱ䤷�Ƥ���stream-enumerate-interval����ɾ����, ���줬
(cons 10001 (delay (stream-enumerate-interval 10002 1000000)))���֤�. stream-filter�Ϥ��Υ��ȥ���car, �Ĥޤ�10,001��į��, �����ޤ��ǿ��Ǥʤ��Τ��Τ�, �⤦����stream-cdr��������Ȥ����դ��ˤ�, stream-enumerate-interval���ǿ�10,007��������ޤ�³����. ���λ�stream-filter������˽��ä�
(cons-stream (stream-car stream) (stream-filter pred (stream-cdr stream)))���֤���, ����Ϻ��ξ��
(cons 10007 (delay (stream-filter prime? (cons 10008 (delay (stream-enumerate-interval 10009 1000000))))))�Ǥ���. ���η�̤ϸ����μ���stream-cdr���Ϥ����. �������ٱ䤷�Ƥ���stream-filter������, ���줬�����ٱ䤷�Ƥ��� stream-enumerate-interval�������ǿ�10,009�Ĥ���ޤ�, ������³����. �Ǹ�˸����μ���stream-car���Ϥ��줿��̤�
(cons 10009 (delay (stream-filter prime? (cons 10010 (delay (stream-enumerate-interval 10011 1000000))))))�Ǥ���. stream-car��10,009���֤�, ���ϴ�λ����. ������ǿ��Ĥ���Τ�ɬ�פʤ������������ǿ��ƥ��Ȥ����, ��֤��ǿ��ե��륿���Ϥ��Τ�ɬ�פʤ���������夲��.
���̤��ٱ�ɾ���� �����ư�ץץ�����ߥȹͤ��뤳�Ȥ������. ���ȥ������γ��ʳ��ϼ����ʳ�����������Τ˽�ʬ�ʤ�����ư�����. ����ޤǤ�ä��ΤϷ��ˤ�������ݤμºݤν��, ��³���θ������ι�¤�� �ڤ�Υ�����ȤǤ���. ����������Ū�ʥץ�����ߥ�������ǤΤ褦��, ���ȥ�ब��������֤ߤ�ʰ��ˡ�¸�ߤ������Τ褦�˼�³�����, �ºݤϷ�������Ū�˼¹Ԥ����.
(delay 〈exp〉)��
(lambda () 〈exp〉)�ι�ʸ���奬���Ǥ���褦���ü�����Ǥ��äƤ褤. force��delay�κ�ä�(�����Τʤ�)��³����ƤӽФ������Ǥ���, force���³��:
(define (force delayed-object) (delayed-object))�ȼ��������.
���μ�����delay��force����������Ƥ���褦��Ư���ˤϽ�ʬ�Ǥ��뤬, ����˼�����������פʺ�Ŭ��������. ¿���α��ѤǤ�Ʊ����ٱ䥪�֥������Ȥ������뤳�Ȥˤʤ�. ����ϥ��ȥ���ޤ�Ƶ��ץ������ǤϤ��Ӥ������Ψ�ˤʤ�. (����3.57����) ���ˡ���ٱ䥪�֥������Ȥ�,�ǽ��ɾ��������, �������ͤ��Ǽ����褦�˺�뤳�ȤǤ���. �����³�������Ϸ����֤���, ñ�˳�Ǽ�����ͤ��֤�. �Ĥޤ�delay ������3.27�ǽҤ٤��褦���ü���Ū�Υ�ⲽ��³���Ȥ��Ƽ�������ΤǤ���. �����ã�������Ĥ���ˡ��, �����Ȥ���(�����ʤ���)��³����Ȥ�, ��³���Υ�ⲽ�Ǥ��֤����μ�³����Ȥ����ȤǤ���. ��ⲽ��³�����ǽ�����ä���, ����̤����Ƥ���. ���θ��ɾ���Ǥ�, ñ�ˤ��η�̤��֤�.
(define (memo-proc proc) (let ((already-run? false) (result false)) (lambda () (if (not already-run?) (begin (set! result (proc)) (set! already-run? true) result) result))))delay�Ϥ�����(delay 〈exp〉)��
(memo-proc (lambda () 〈exp〉))�������ʤ褦�������, force�ϰ����ΤޤޤǤ���.58
(define (stream-map proc . argstreams) (if (〈??〉 (car argstreams)) the-empty-stream (〈??〉 (apply proc (map 〈??〉 argstreams)) (apply stream-map (cons proc (map 〈??〉 argstreams))))))
(define (show x) (display-line x) x)���Τ��줾��μ���ɾ���˱�����, ���Ϥϲ���������뤫.59
(define x (stream-map show (stream-enumerate-interval 0 10))) (stream-ref x 5) (stream-ref x 7)
(define sum 0) (define (accum x) (set! sum (+ x sum)) sum) (define seq (stream-map accum (stream-enumerate-interval 1 20))) (define y (stream-filter even? seq)) (define z (stream-filter (lambda (x) (= (remainder x 5) 0)) seq)) (stream-ref y 7) (display-stream z)��γƼ���ɾ�������ä���, sum���ͤϲ���. stream-ref��display-stream����ɾ���˱����ư������������ϲ���. ���α�����(delay 〈exp〉)��ñ��(lambda () 〈exp〉)�Ǽ�����, memo-proc���Ѱդ����Ŭ����Ȥ�ʤ��ä����Ȥɤ��㤦��. ��������.
53
�ǿ�����ƥ��Ȥ���(1.2.6��Τ褦��)�Ҹ�prime?������Ȳ��ꤻ��.
54
MIT�μ����Ǥ�,
the-empty-stream�϶��ꥹ��'()��Ʊ���Ǥ���,
stream-null?��null?��Ʊ���Ǥ���.
55
���Τ��Ȥǻפ��Ѥ������Τ�ʤ�. ���ȥ��ȥꥹ�Ȥ��Ф��Ƥ���������ʼ�³����������뤳�Ȥ�, ���פ���ݤΤ����餫�����ȤǤ���. ���ä����Ȥ�, ������ݤ����Ѥ��뤿��ˤ�, ɾ���Υץ��������Ф�, ����������, �٤�������ʤ���Фʤ�ʤ�. �������ˤĤ��Ƥ�, 3.5.4��κǸ�ǹ��������褦.
4.2��Ǥϥꥹ�Ȥȥ��ȥ������礹�����Ȥ�ȯ����.
56
stream-car��stream-cdr�ϼ�³���Ȥ����������뤬,
cons-stream���ü�����Ǥʤ���Фʤ�ʤ�. cons-stream����³���ʤ�, ������ɾ����ǥ�˽��ä�, (cons-stream
〈a〉 〈b〉)�ϼ�ưŪ��〈b〉��ɾ������, ����Ϥޤ��˵������ߤ����ʤ��Ȥ����Ǥ���. Ʊ�ͤ���ͳ��force���̾�μ�³������,
delay���ü�����Ǥʤ���Фʤ�ʤ�.
57
�����˼������ͤ��ٱ估�ˤϼºݤˤϸ���ʤ�. �ºݤ˸����Τ�, �ѿ���Ŭ�ڤ��ͤ�«������Ƥ���Ķ��Ǥθ����μ��Ǥ���. �㤨��10001�ȤʤäƤ���Ȥ����ϼºݤ�(+ low 1)������Ƥ���, low
��10,000��«������Ƥ���.
58
����˽Ҥ٤��ΰʳ��ˤ⥹�ȥ��β�ǽ�ʼ����Ϥ�����������. ���ȥ������Ū�ˤ��븰���ٱ�ɾ����
Algol 60��̾���Ƥ�(call-by-name)�Υѥ��Ϥ���ͳ�褹��. ���ε�����ȤäƤΥ��ȥ��μ�����
Landin(1965)���ǽ�˽Ҥ٤�. ���ȥ����ٱ�ɾ����
Friedman��
Wise(1976)��Lisp��Ƴ������. ���μ����Ǥ�cons�Ͼ�ˤ��ΰ������ٱ�ɾ�������Τ�, �ꥹ�Ȥϼ�ưŪ�˥��ȥ��Ȥ��ƿ���ä�. ��ⲽ�κ�Ŭ����
ɬ�Ƥ�(call-by-need)�Ȥ��Ƥ��Τ��Ƥ���. Algol�Ҳ��, �������ٱ䥪�֥������Ȥ��̾���Ƥӥ���(call-by-name thunk)�Ȥ���,
��Ŭ���Ǥ��ɬ�Ƥӥ���(call-by-need thunk)�Ȥ�������.
59
3.51��3.52�Τ褦�������delay���ɤ�Ư�����������ƥ��Ȥ���Τ�ͭ�ѤǤ���. ¾��, �ٱ�ɾ���������---��äȰ������������, �����礻��Ⱥ��𤹤�. ��������β��ܤζ��դ�, ������ˤ���褦�ʻ���������Ū�˳�����줷��Ƥ���. ��������ۣ�椵�˰�¸����ץ�������Τ�
�褯�ʤ��ץ�����ॹ������Ǥ��뤳�ȤϤ����ޤǤ�ʤ�. ���ȥ�������ǽ�Ϥΰ�����, �ץ���������ǻ��ݤ��ºݤ˵�������̵�뤵���뤳�ȤǤ���. �Թ��ˤ⤳���, �����Ѳ��˴ؿ����������٤������Τ���Ȥ����Ǥ�,
��äƤ����ʤ����ȤǤ���.