[ �ܼ�, ����, ����, ���� ]

3.5.1 ���ȥ꡼����ٱ�ꥹ��



2.2.3��Ǹ����褦��, �¤Ӥϥץ���������ʤ��Ȥ߹礻��ɸ�।�󥿡��ե������Ȥ�����Ω��. ���Ϥʱ黻��ʷ��ͥ������ˡ�Ǽ�������㤨�� map, filter��accumulate�Τ褦���¤Ӥ����붯�Ϥ���ݤ����������.

   ���ä����Ȥ�, �¤Ӥ�ꥹ�Ȥ�ɽ��������, ����ͥ�����Ϸ׻���ɬ�פȤ�����ȶ��֤˴ؤ��Ƥθ��������Ψ������Ȥ��������Ƥ���. �¤Ӥ�����ꥹ�Ȥ��Ѵ��Ȥ���ɽ�������, �ץ������Ͻ����γƥ��ƥåפ�(����ˤʤꤽ����)�ǡ�����¤������, ʣ�̤��ʤ���Фʤ�ʤ�.

   �ʤ����줬�����ʤΤ��򸫤뤿��, �����֤��ǿ������¤�׻�������ĤΥץ���������٤褦. ���Υץ�������ɸ��Ūȿ���η��ǽ񤤤Ƥ���: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��

(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��force���
delay��force���Ի׵Ĥʱ黻�Τ褦�˸����뤫���Τ�ʤ���, ���μ����ϼºݤ�����ľ٣�Ǥ���. delay�ϸ���׵�˱�����ɾ�������褦, ����ѥå������ˤ��ʤ���Фʤ�ʤ�. ����ϼ����³����������ΤȤ��ư������Ȥ�ã�������. delay��
(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

���� 3.50


2.2.1��, ����12��map�Ȼ���ʣ���ΰ�����Ȥ��³��������褦��stream-map����̲����뼡�������������.
(define (stream-map proc . argstreams)
  (if (⟨??⟩ (car argstreams))
      the-empty-stream
      (⟨??⟩
       (apply proc (map ⟨??⟩ argstreams))
       (apply stream-map
              (cons proc (map ⟨??⟩ argstreams))))))


���� 3.51


�ٱ�ɾ�����褯������褦��, ������������Ƥ��餽����֤������μ��μ�³����Ȥ���.
(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)


���� 3.52


���ΰ�Ϣ�μ���ͤ���.
(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���ɤ�Ư�����������ƥ��Ȥ���Τ�ͭ�ѤǤ���. ¾��, �ٱ�ɾ���������---��äȰ������������, �����礻��Ⱥ��𤹤�. �׻�������β��ܤζ��դ�, ������ˤ���褦�ʻ���������Ū�˳�����줷��Ƥ���. ��������ۣ�椵�˰�¸����ץ�������񤯤Τ� �褯�ʤ��ץ�����ॹ������Ǥ��뤳�ȤϤ����ޤǤ�ʤ�. ���ȥ꡼�������ǽ�Ϥΰ�����, �ץ���������ǻ��ݤ��ºݤ˵�������̵�뤵���뤳�ȤǤ���. �Թ��ˤ⤳���, �����Ѳ��˴ؿ����������٤������Τ���Ȥ����Ǥ�, ��äƤ����ʤ����ȤǤ���.

[ �ܼ�, ����, ����, ���� ]