Hex Artifact Content
Not logged in

Artifact 62cb2f949f9d132069c40e52d89882fb5071bddd:


0000: 3b 20 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76  ; #!/usr/bin/env
0010: 20 73 63 68 65 6d 65 2d 73 63 72 69 70 74 0d 0a   scheme-script..
0020: 0d 0a 3b 20 43 6f 70 79 72 69 67 68 74 20 28 43  ..; Copyright (C
0030: 29 20 32 30 30 37 20 62 79 20 50 68 69 6c 69 70  ) 2007 by Philip
0040: 20 4c 2e 20 42 65 77 69 67 20 6f 66 20 53 61 69   L. Bewig of Sai
0050: 6e 74 20 4c 6f 75 69 73 2c 20 4d 69 73 73 6f 75  nt Louis, Missou
0060: 72 69 2c 20 55 53 41 2e 0d 0a 3b 20 41 6c 6c 20  ri, USA...; All 
0070: 72 69 67 68 74 73 20 72 65 73 65 72 76 65 64 2e  rights reserved.
0080: 20 20 50 65 72 6d 69 73 73 69 6f 6e 20 69 73 20    Permission is 
0090: 68 65 72 65 62 79 20 67 72 61 6e 74 65 64 2c 20  hereby granted, 
00a0: 66 72 65 65 20 6f 66 20 63 68 61 72 67 65 2c 0d  free of charge,.
00b0: 0a 3b 20 74 6f 20 61 6e 79 20 70 65 72 73 6f 6e  .; to any person
00c0: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 6f 70   obtaining a cop
00d0: 79 20 6f 66 0d 0a 3b 20 74 68 69 73 20 73 6f 66  y of..; this sof
00e0: 74 77 61 72 65 20 61 6e 64 20 61 73 73 6f 63 69  tware and associ
00f0: 61 74 65 64 20 64 6f 63 75 6d 65 6e 74 61 74 69  ated documentati
0100: 6f 6e 20 66 69 6c 65 73 20 28 74 68 65 20 22 53  on files (the "S
0110: 6f 66 74 77 61 72 65 22 29 2c 0d 0a 3b 20 74 6f  oftware"),..; to
0120: 20 64 65 61 6c 20 69 6e 20 74 68 65 20 53 6f 66   deal in the Sof
0130: 74 77 61 72 65 20 77 69 74 68 6f 75 74 20 72 65  tware without re
0140: 73 74 72 69 63 74 69 6f 6e 2c 20 69 6e 63 6c 75  striction, inclu
0150: 64 69 6e 67 20 77 69 74 68 6f 75 74 0d 0a 3b 20  ding without..; 
0160: 6c 69 6d 69 74 61 74 69 6f 6e 20 74 68 65 20 72  limitation the r
0170: 69 67 68 74 73 20 74 6f 20 75 73 65 2c 20 63 6f  ights to use, co
0180: 70 79 2c 20 6d 6f 64 69 66 79 2c 20 6d 65 72 67  py, modify, merg
0190: 65 2c 20 70 75 62 6c 69 73 68 2c 0d 0a 3b 20 64  e, publish,..; d
01a0: 69 73 74 72 69 62 75 74 65 2c 20 73 75 62 6c 69  istribute, subli
01b0: 63 65 6e 73 65 2c 20 61 6e 64 2f 6f 72 20 73 65  cense, and/or se
01c0: 6c 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ll copies of the
01d0: 20 53 6f 66 74 77 61 72 65 2c 20 61 6e 64 20 74   Software, and t
01e0: 6f 0d 0a 3b 20 70 65 72 6d 69 74 20 70 65 72 73  o..; permit pers
01f0: 6f 6e 73 20 74 6f 20 77 68 6f 6d 20 74 68 65 20  ons to whom the 
0200: 53 6f 66 74 77 61 72 65 20 69 73 20 66 75 72 6e  Software is furn
0210: 69 73 68 65 64 20 74 6f 20 64 6f 20 73 6f 2c 20  ished to do so, 
0220: 73 75 62 6a 65 63 74 0d 0a 3b 20 74 6f 20 74 68  subject..; to th
0230: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64  e following cond
0240: 69 74 69 6f 6e 73 3a 20 54 68 65 20 61 62 6f 76  itions: The abov
0250: 65 20 63 6f 70 79 72 69 67 68 74 20 6e 6f 74 69  e copyright noti
0260: 63 65 20 61 6e 64 20 74 68 69 73 0d 0a 3b 20 70  ce and this..; p
0270: 65 72 6d 69 73 73 69 6f 6e 20 6e 6f 74 69 63 65  ermission notice
0280: 20 73 68 61 6c 6c 20 62 65 20 69 6e 63 6c 75 64   shall be includ
0290: 65 64 20 69 6e 20 61 6c 6c 20 63 6f 70 69 65 73  ed in all copies
02a0: 20 6f 72 20 73 75 62 73 74 61 6e 74 69 61 6c 0d   or substantial.
02b0: 0a 3b 20 70 6f 72 74 69 6f 6e 73 20 6f 66 20 74  .; portions of t
02c0: 68 65 20 53 6f 66 74 77 61 72 65 2e 20 20 54 48  he Software.  TH
02d0: 45 20 53 4f 46 54 57 41 52 45 20 49 53 20 50 52  E SOFTWARE IS PR
02e0: 4f 56 49 44 45 44 20 22 41 53 20 49 53 22 2c 20  OVIDED "AS IS", 
02f0: 57 49 54 48 4f 55 54 0d 0a 3b 20 57 41 52 52 41  WITHOUT..; WARRA
0300: 4e 54 59 20 4f 46 20 41 4e 59 20 4b 49 4e 44 2c  NTY OF ANY KIND,
0310: 20 45 58 50 52 45 53 53 20 4f 52 20 49 4d 50 4c   EXPRESS OR IMPL
0320: 49 45 44 2c 20 49 4e 43 4c 55 44 49 4e 47 20 42  IED, INCLUDING B
0330: 55 54 20 4e 4f 54 20 4c 49 4d 49 54 45 44 0d 0a  UT NOT LIMITED..
0340: 3b 20 54 4f 20 54 48 45 20 57 41 52 52 41 4e 54  ; TO THE WARRANT
0350: 49 45 53 20 4f 46 20 4d 45 52 43 48 41 4e 54 41  IES OF MERCHANTA
0360: 42 49 4c 49 54 59 2c 20 46 49 54 4e 45 53 53 20  BILITY, FITNESS 
0370: 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52  FOR A PARTICULAR
0380: 0d 0a 3b 20 50 55 52 50 4f 53 45 20 41 4e 44 20  ..; PURPOSE AND 
0390: 4e 4f 4e 49 4e 46 52 49 4e 47 45 4d 45 4e 54 2e  NONINFRINGEMENT.
03a0: 20 49 4e 20 4e 4f 20 45 56 45 4e 54 20 53 48 41   IN NO EVENT SHA
03b0: 4c 4c 20 54 48 45 20 41 55 54 48 4f 52 53 20 4f  LL THE AUTHORS O
03c0: 52 0d 0a 3b 20 43 4f 50 59 52 49 47 48 54 20 48  R..; COPYRIGHT H
03d0: 4f 4c 44 45 52 53 20 42 45 20 4c 49 41 42 4c 45  OLDERS BE LIABLE
03e0: 20 46 4f 52 20 41 4e 59 20 43 4c 41 49 4d 2c 20   FOR ANY CLAIM, 
03f0: 44 41 4d 41 47 45 53 20 4f 52 20 4f 54 48 45 52  DAMAGES OR OTHER
0400: 0d 0a 3b 20 4c 49 41 42 49 4c 49 54 59 2c 20 57  ..; LIABILITY, W
0410: 48 45 54 48 45 52 20 49 4e 20 41 4e 20 41 43 54  HETHER IN AN ACT
0420: 49 4f 4e 20 4f 46 20 43 4f 4e 54 52 41 43 54 2c  ION OF CONTRACT,
0430: 20 54 4f 52 54 20 4f 52 20 4f 54 48 45 52 57 49   TORT OR OTHERWI
0440: 53 45 2c 0d 0a 3b 20 41 52 49 53 49 4e 47 20 46  SE,..; ARISING F
0450: 52 4f 4d 2c 20 4f 55 54 20 4f 46 20 4f 52 20 49  ROM, OUT OF OR I
0460: 4e 20 43 4f 4e 4e 45 43 54 49 4f 4e 20 57 49 54  N CONNECTION WIT
0470: 48 20 54 48 45 20 53 4f 46 54 57 41 52 45 20 4f  H THE SOFTWARE O
0480: 52 20 54 48 45 20 55 53 45 0d 0a 3b 20 4f 52 20  R THE USE..; OR 
0490: 4f 54 48 45 52 20 44 45 41 4c 49 4e 47 53 20 49  OTHER DEALINGS I
04a0: 4e 20 54 48 45 20 53 4f 46 54 57 41 52 45 2e 0d  N THE SOFTWARE..
04b0: 0a 0d 0a 28 69 6d 70 6f 72 74 20 28 73 75 72 66  ...(import (surf
04c0: 61 67 65 20 73 34 31 20 73 74 72 65 61 6d 73 29  age s41 streams)
04d0: 0d 0a 20 20 20 20 20 20 20 20 28 65 78 63 65 70  ..        (excep
04e0: 74 20 28 72 6e 72 73 29 20 61 73 73 65 72 74 29  t (rnrs) assert)
04f0: 0d 0a 20 20 20 20 20 20 20 20 28 72 6e 72 73 20  ..        (rnrs 
0500: 72 35 72 73 29 29 0d 0a 0d 0a 28 64 65 66 69 6e  r5rs))....(defin
0510: 65 20 28 61 64 64 31 20 6e 29 20 28 2b 20 6e 20  e (add1 n) (+ n 
0520: 31 29 29 0d 0a 0d 0a 28 64 65 66 69 6e 65 20 28  1))....(define (
0530: 6c 73 65 63 20 70 72 6f 63 20 2e 20 61 72 67 73  lsec proc . args
0540: 29 0d 0a 20 20 28 6c 61 6d 62 64 61 20 78 20 28  )..  (lambda x (
0550: 61 70 70 6c 79 20 70 72 6f 63 20 28 61 70 70 65  apply proc (appe
0560: 6e 64 20 61 72 67 73 20 78 29 29 29 29 0d 0a 0d  nd args x))))...
0570: 0a 28 64 65 66 69 6e 65 20 28 72 73 65 63 20 70  .(define (rsec p
0580: 72 6f 63 20 2e 20 61 72 67 73 29 0d 0a 20 20 28  roc . args)..  (
0590: 6c 61 6d 62 64 61 20 78 20 28 61 70 70 6c 79 20  lambda x (apply 
05a0: 70 72 6f 63 20 28 72 65 76 65 72 73 65 20 28 61  proc (reverse (a
05b0: 70 70 65 6e 64 20 28 72 65 76 65 72 73 65 20 61  ppend (reverse a
05c0: 72 67 73 29 20 28 72 65 76 65 72 73 65 20 78 29  rgs) (reverse x)
05d0: 29 29 29 29 29 0d 0a 0d 0a 28 64 65 66 69 6e 65  )))))....(define
05e0: 2d 73 74 72 65 61 6d 20 28 71 73 6f 72 74 20 6c  -stream (qsort l
05f0: 74 3f 20 73 74 72 6d 29 0d 0a 20 20 28 69 66 20  t? strm)..  (if 
0600: 28 73 74 72 65 61 6d 2d 6e 75 6c 6c 3f 20 73 74  (stream-null? st
0610: 72 6d 29 0d 0a 20 20 20 20 20 20 73 74 72 65 61  rm)..      strea
0620: 6d 2d 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 28 6c  m-null..      (l
0630: 65 74 20 28 28 78 20 28 73 74 72 65 61 6d 2d 63  et ((x (stream-c
0640: 61 72 20 73 74 72 6d 29 29 0d 0a 20 20 20 20 20  ar strm))..     
0650: 20 20 20 20 20 20 20 28 78 73 20 28 73 74 72 65         (xs (stre
0660: 61 6d 2d 63 64 72 20 73 74 72 6d 29 29 29 0d 0a  am-cdr strm)))..
0670: 20 20 20 20 20 20 20 20 28 73 74 72 65 61 6d 2d          (stream-
0680: 61 70 70 65 6e 64 0d 0a 20 20 20 20 20 20 20 20  append..        
0690: 20 20 28 71 73 6f 72 74 20 6c 74 3f 0d 0a 20 20    (qsort lt?..  
06a0: 20 20 20 20 20 20 20 20 20 20 28 73 74 72 65 61            (strea
06b0: 6d 2d 66 69 6c 74 65 72 0d 0a 20 20 20 20 20 20  m-filter..      
06c0: 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20          (lambda 
06d0: 28 75 29 20 28 6c 74 3f 20 75 20 78 29 29 0d 0a  (u) (lt? u x))..
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 73                xs
06f0: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 28 73  ))..          (s
0700: 74 72 65 61 6d 20 78 29 0d 0a 20 20 20 20 20 20  tream x)..      
0710: 20 20 20 20 28 71 73 6f 72 74 20 6c 74 3f 0d 0a      (qsort lt?..
0720: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 74 72              (str
0730: 65 61 6d 2d 66 69 6c 74 65 72 0d 0a 20 20 20 20  eam-filter..    
0740: 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64            (lambd
0750: 61 20 28 75 29 20 28 6e 6f 74 20 28 6c 74 3f 20  a (u) (not (lt? 
0760: 75 20 78 29 29 29 0d 0a 20 20 20 20 20 20 20 20  u x)))..        
0770: 20 20 20 20 20 20 78 73 29 29 29 29 29 29 0d 0a        xs))))))..
0780: 0d 0a 28 64 65 66 69 6e 65 2d 73 74 72 65 61 6d  ..(define-stream
0790: 20 28 69 73 6f 72 74 20 6c 74 3f 20 73 74 72 6d   (isort lt? strm
07a0: 29 0d 0a 20 20 20 20 28 64 65 66 69 6e 65 2d 73  )..    (define-s
07b0: 74 72 65 61 6d 20 28 69 6e 73 65 72 74 20 73 74  tream (insert st
07c0: 72 6d 20 78 29 0d 0a 20 20 20 20 20 20 28 73 74  rm x)..      (st
07d0: 72 65 61 6d 2d 6d 61 74 63 68 20 73 74 72 6d 0d  ream-match strm.
07e0: 0a 20 20 20 20 20 20 20 20 28 28 29 20 28 73 74  .        (() (st
07f0: 72 65 61 6d 20 78 29 29 0d 0a 20 20 20 20 20 20  ream x))..      
0800: 20 20 28 28 79 20 2e 20 79 73 29 0d 0a 20 20 20    ((y . ys)..   
0810: 20 20 20 20 20 20 20 28 69 66 20 28 6c 74 3f 20         (if (lt? 
0820: 79 20 78 29 0d 0a 20 20 20 20 20 20 20 20 20 20  y x)..          
0830: 20 20 20 20 28 73 74 72 65 61 6d 2d 63 6f 6e 73      (stream-cons
0840: 20 79 20 28 69 6e 73 65 72 74 20 79 73 20 78 29   y (insert ys x)
0850: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
0860: 20 28 73 74 72 65 61 6d 2d 63 6f 6e 73 20 78 20   (stream-cons x 
0870: 73 74 72 6d 29 29 29 29 29 0d 0a 20 20 20 20 28  strm)))))..    (
0880: 73 74 72 65 61 6d 2d 66 6f 6c 64 20 69 6e 73 65  stream-fold inse
0890: 72 74 20 73 74 72 65 61 6d 2d 6e 75 6c 6c 20 73  rt stream-null s
08a0: 74 72 6d 29 29 0d 0a 0d 0a 28 64 65 66 69 6e 65  trm))....(define
08b0: 2d 73 74 72 65 61 6d 20 28 73 74 72 65 61 6d 2d  -stream (stream-
08c0: 6d 65 72 67 65 20 6c 74 3f 20 2e 20 73 74 72 6d  merge lt? . strm
08d0: 73 29 0d 0a 20 20 28 64 65 66 69 6e 65 2d 73 74  s)..  (define-st
08e0: 72 65 61 6d 20 28 6d 65 72 67 65 20 78 78 20 79  ream (merge xx y
08f0: 79 29 0d 0a 20 20 20 20 28 73 74 72 65 61 6d 2d  y)..    (stream-
0900: 6d 61 74 63 68 20 78 78 20 28 28 29 20 79 79 29  match xx (() yy)
0910: 20 28 28 78 20 2e 20 78 73 29 0d 0a 20 20 20 20   ((x . xs)..    
0920: 20 20 28 73 74 72 65 61 6d 2d 6d 61 74 63 68 20    (stream-match 
0930: 79 79 20 28 28 29 20 78 78 29 20 28 28 79 20 2e  yy (() xx) ((y .
0940: 20 79 73 29 0d 0a 20 20 20 20 20 20 20 20 28 69   ys)..        (i
0950: 66 20 28 6c 74 3f 20 79 20 78 29 0d 0a 20 20 20  f (lt? y x)..   
0960: 20 20 20 20 20 20 20 20 20 28 73 74 72 65 61 6d           (stream
0970: 2d 63 6f 6e 73 20 79 20 28 6d 65 72 67 65 20 78  -cons y (merge x
0980: 78 20 79 73 29 29 0d 0a 20 20 20 20 20 20 20 20  x ys))..        
0990: 20 20 20 20 28 73 74 72 65 61 6d 2d 63 6f 6e 73      (stream-cons
09a0: 20 78 20 28 6d 65 72 67 65 20 78 73 20 79 79 29   x (merge xs yy)
09b0: 29 29 29 29 29 29 29 0d 0a 20 20 28 73 74 72 65  )))))))..  (stre
09c0: 61 6d 2d 6c 65 74 20 6c 6f 6f 70 20 28 28 73 74  am-let loop ((st
09d0: 72 6d 73 20 73 74 72 6d 73 29 29 0d 0a 20 20 20  rms strms))..   
09e0: 20 28 63 6f 6e 64 20 28 28 6e 75 6c 6c 3f 20 73   (cond ((null? s
09f0: 74 72 6d 73 29 20 73 74 72 65 61 6d 2d 6e 75 6c  trms) stream-nul
0a00: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 28 28  l)..          ((
0a10: 6e 75 6c 6c 3f 20 28 63 64 72 20 73 74 72 6d 73  null? (cdr strms
0a20: 29 29 20 28 63 61 72 20 73 74 72 6d 73 29 29 0d  )) (car strms)).
0a30: 0a 20 20 20 20 20 20 20 20 20 20 28 65 6c 73 65  .          (else
0a40: 20 28 6d 65 72 67 65 20 28 63 61 72 20 73 74 72   (merge (car str
0a50: 6d 73 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ms)..           
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 28 61 70 70              (app
0a70: 6c 79 20 73 74 72 65 61 6d 2d 6d 65 72 67 65 20  ly stream-merge 
0a80: 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lt?..           
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
0aa0: 64 72 20 73 74 72 6d 73 29 29 29 29 29 29 29 0d  dr strms))))))).
0ab0: 0a 0d 0a 28 64 65 66 69 6e 65 2d 73 74 72 65 61  ...(define-strea
0ac0: 6d 20 28 6d 73 6f 72 74 20 6c 74 3f 20 73 74 72  m (msort lt? str
0ad0: 6d 29 0d 0a 20 20 28 6c 65 74 2a 20 28 28 6e 20  m)..  (let* ((n 
0ae0: 28 71 75 6f 74 69 65 6e 74 20 28 73 74 72 65 61  (quotient (strea
0af0: 6d 2d 6c 65 6e 67 74 68 20 73 74 72 6d 29 20 32  m-length strm) 2
0b00: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 28 74 73  ))..         (ts
0b10: 20 28 73 74 72 65 61 6d 2d 74 61 6b 65 20 6e 20   (stream-take n 
0b20: 73 74 72 6d 29 29 0d 0a 20 20 20 20 20 20 20 20  strm))..        
0b30: 20 28 64 73 20 28 73 74 72 65 61 6d 2d 64 72 6f   (ds (stream-dro
0b40: 70 20 6e 20 73 74 72 6d 29 29 29 0d 0a 20 20 20  p n strm)))..   
0b50: 20 28 69 66 20 28 7a 65 72 6f 3f 20 6e 29 0d 0a   (if (zero? n)..
0b60: 20 20 20 20 20 20 20 20 73 74 72 6d 0d 0a 20 20          strm..  
0b70: 20 20 20 20 20 20 28 73 74 72 65 61 6d 2d 6d 65        (stream-me
0b80: 72 67 65 20 6c 74 3f 0d 0a 20 20 20 20 20 20 20  rge lt?..       
0b90: 20 20 20 28 6d 73 6f 72 74 20 3c 20 74 73 29 20     (msort < ts) 
0ba0: 28 6d 73 6f 72 74 20 3c 20 64 73 29 29 29 29 29  (msort < ds)))))
0bb0: 0d 0a 0d 0a 28 64 65 66 69 6e 65 2d 73 74 72 65  ....(define-stre
0bc0: 61 6d 20 28 73 74 72 65 61 6d 2d 75 6e 69 71 75  am (stream-uniqu
0bd0: 65 20 65 71 6c 3f 20 73 74 72 6d 29 0d 0a 20 20  e eql? strm)..  
0be0: 28 69 66 20 28 73 74 72 65 61 6d 2d 6e 75 6c 6c  (if (stream-null
0bf0: 3f 20 73 74 72 6d 29 0d 0a 20 20 20 20 20 20 73  ? strm)..      s
0c00: 74 72 65 61 6d 2d 6e 75 6c 6c 0d 0a 20 20 20 20  tream-null..    
0c10: 20 20 28 73 74 72 65 61 6d 2d 63 6f 6e 73 20 28    (stream-cons (
0c20: 73 74 72 65 61 6d 2d 63 61 72 20 73 74 72 6d 29  stream-car strm)
0c30: 0d 0a 20 20 20 20 20 20 20 20 28 73 74 72 65 61  ..        (strea
0c40: 6d 2d 75 6e 69 71 75 65 20 65 71 6c 3f 0d 0a 20  m-unique eql?.. 
0c50: 20 20 20 20 20 20 20 20 20 28 73 74 72 65 61 6d           (stream
0c60: 2d 64 72 6f 70 2d 77 68 69 6c 65 0d 0a 20 20 20  -drop-while..   
0c70: 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61           (lambda
0c80: 20 28 78 29 0d 0a 20 20 20 20 20 20 20 20 20 20   (x)..          
0c90: 20 20 20 20 28 65 71 6c 3f 20 28 73 74 72 65 61      (eql? (strea
0ca0: 6d 2d 63 61 72 20 73 74 72 6d 29 20 78 29 29 0d  m-car strm) x)).
0cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
0cc0: 6d 29 29 29 29 29 0d 0a 0d 0a 28 64 65 66 69 6e  m)))))....(defin
0cd0: 65 20 6e 61 74 73 0d 0a 20 20 28 73 74 72 65 61  e nats..  (strea
0ce0: 6d 2d 63 6f 6e 73 20 30 0d 0a 20 20 20 20 28 73  m-cons 0..    (s
0cf0: 74 72 65 61 6d 2d 6d 61 70 20 61 64 64 31 20 6e  tream-map add1 n
0d00: 61 74 73 29 29 29 0d 0a 0d 0a 28 64 65 66 69 6e  ats)))....(defin
0d10: 65 20 68 61 6d 6d 69 6e 67 0d 0a 20 20 28 73 74  e hamming..  (st
0d20: 72 65 61 6d 2d 75 6e 69 71 75 65 20 3d 0d 0a 20  ream-unique =.. 
0d30: 20 20 20 28 73 74 72 65 61 6d 2d 63 6f 6e 73 20     (stream-cons 
0d40: 31 0d 0a 20 20 20 20 20 20 28 73 74 72 65 61 6d  1..      (stream
0d50: 2d 6d 65 72 67 65 20 3c 0d 0a 20 20 20 20 20 20  -merge <..      
0d60: 20 20 28 73 74 72 65 61 6d 2d 6d 61 70 20 28 6c    (stream-map (l
0d70: 73 65 63 20 2a 20 32 29 20 68 61 6d 6d 69 6e 67  sec * 2) hamming
0d80: 29 0d 0a 20 20 20 20 20 20 20 20 28 73 74 72 65  )..        (stre
0d90: 61 6d 2d 6d 65 72 67 65 20 3c 0d 0a 20 20 20 20  am-merge <..    
0da0: 20 20 20 20 20 20 28 73 74 72 65 61 6d 2d 6d 61        (stream-ma
0db0: 70 20 28 6c 73 65 63 20 2a 20 33 29 20 68 61 6d  p (lsec * 3) ham
0dc0: 6d 69 6e 67 29 0d 0a 20 20 20 20 20 20 20 20 20  ming)..         
0dd0: 20 28 73 74 72 65 61 6d 2d 6d 61 70 20 28 6c 73   (stream-map (ls
0de0: 65 63 20 2a 20 35 29 20 68 61 6d 6d 69 6e 67 29  ec * 5) hamming)
0df0: 29 29 29 29 29 0d 0a 0d 0a 28 64 65 66 69 6e 65  )))))....(define
0e00: 20 70 72 69 6d 65 73 20 28 6c 65 74 20 28 29 0d   primes (let ().
0e10: 0a 20 20 28 64 65 66 69 6e 65 2d 73 74 72 65 61  .  (define-strea
0e20: 6d 20 28 6e 65 78 74 20 62 61 73 65 20 6d 75 6c  m (next base mul
0e30: 74 20 73 74 72 6d 29 0d 0a 20 20 20 20 28 6c 65  t strm)..    (le
0e40: 74 20 28 28 66 69 72 73 74 20 28 73 74 72 65 61  t ((first (strea
0e50: 6d 2d 63 61 72 20 73 74 72 6d 29 29 0d 0a 20 20  m-car strm))..  
0e60: 20 20 20 20 20 20 20 20 28 72 65 73 74 20 28 73          (rest (s
0e70: 74 72 65 61 6d 2d 63 64 72 20 73 74 72 6d 29 29  tream-cdr strm))
0e80: 29 0d 0a 20 20 20 20 20 20 28 63 6f 6e 64 20 28  )..      (cond (
0e90: 28 3c 20 66 69 72 73 74 20 6d 75 6c 74 29 0d 0a  (< first mult)..
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
0eb0: 74 72 65 61 6d 2d 63 6f 6e 73 20 66 69 72 73 74  tream-cons first
0ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0ed0: 20 20 28 6e 65 78 74 20 62 61 73 65 20 6d 75 6c    (next base mul
0ee0: 74 20 72 65 73 74 29 29 29 0d 0a 20 20 20 20 20  t rest)))..     
0ef0: 20 20 20 20 20 20 20 28 28 3c 20 6d 75 6c 74 20         ((< mult 
0f00: 66 69 72 73 74 29 0d 0a 20 20 20 20 20 20 20 20  first)..        
0f10: 20 20 20 20 20 20 28 6e 65 78 74 20 62 61 73 65        (next base
0f20: 20 28 2b 20 62 61 73 65 20 6d 75 6c 74 29 20 73   (+ base mult) s
0f30: 74 72 6d 29 29 0d 0a 20 20 20 20 20 20 20 20 20  trm))..         
0f40: 20 20 20 28 65 6c 73 65 20 28 6e 65 78 74 20 62     (else (next b
0f50: 61 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ase..           
0f60: 20 20 20 20 20 20 20 20 20 28 2b 20 62 61 73 65           (+ base
0f70: 20 6d 75 6c 74 29 20 72 65 73 74 29 29 29 29 29   mult) rest)))))
0f80: 0d 0a 20 20 28 64 65 66 69 6e 65 2d 73 74 72 65  ..  (define-stre
0f90: 61 6d 20 28 73 69 66 74 20 62 61 73 65 20 73 74  am (sift base st
0fa0: 72 6d 29 0d 0a 20 20 20 20 28 6e 65 78 74 20 62  rm)..    (next b
0fb0: 61 73 65 20 28 2b 20 62 61 73 65 20 62 61 73 65  ase (+ base base
0fc0: 29 20 73 74 72 6d 29 29 0d 0a 20 20 28 64 65 66  ) strm))..  (def
0fd0: 69 6e 65 2d 73 74 72 65 61 6d 20 28 73 69 65 76  ine-stream (siev
0fe0: 65 20 73 74 72 6d 29 0d 0a 20 20 20 20 28 6c 65  e strm)..    (le
0ff0: 74 20 28 28 66 69 72 73 74 20 28 73 74 72 65 61  t ((first (strea
1000: 6d 2d 63 61 72 20 73 74 72 6d 29 29 0d 0a 20 20  m-car strm))..  
1010: 20 20 20 20 20 20 20 20 28 72 65 73 74 20 28 73          (rest (s
1020: 74 72 65 61 6d 2d 63 64 72 20 73 74 72 6d 29 29  tream-cdr strm))
1030: 29 0d 0a 20 20 20 20 20 20 28 73 74 72 65 61 6d  )..      (stream
1040: 2d 63 6f 6e 73 20 66 69 72 73 74 0d 0a 20 20 20  -cons first..   
1050: 20 20 20 20 20 28 73 69 65 76 65 20 28 73 69 66       (sieve (sif
1060: 74 20 66 69 72 73 74 20 72 65 73 74 29 29 29 29  t first rest))))
1070: 29 0d 0a 20 20 28 73 69 65 76 65 20 28 73 74 72  )..  (sieve (str
1080: 65 61 6d 2d 66 72 6f 6d 20 32 29 29 29 29 0d 0a  eam-from 2))))..
1090: 0d 0a 28 64 65 66 69 6e 65 20 28 68 61 6e 64 6c  ..(define (handl
10a0: 65 2d 61 73 73 65 72 74 69 6f 6e 20 74 68 75 6e  e-assertion thun
10b0: 6b 20 65 78 70 72 20 72 65 73 75 6c 74 29 0d 0a  k expr result)..
10c0: 20 20 28 63 6f 6e 64 0d 0a 20 20 20 20 5b 28 73    (cond..    [(s
10d0: 74 72 69 6e 67 3f 20 72 65 73 75 6c 74 29 20 0d  tring? result) .
10e0: 0a 20 20 20 20 20 3b 3b 3b 20 65 72 72 6f 72 20  .     ;;; error 
10f0: 63 61 73 65 0d 0a 20 20 20 20 20 28 63 61 6c 6c  case..     (call
1100: 2f 63 63 0d 0a 20 20 20 20 20 20 20 28 6c 61 6d  /cc..       (lam
1110: 62 64 61 20 28 6b 29 20 0d 0a 20 20 20 20 20 20  bda (k) ..      
1120: 20 20 20 3b 3b 3b 20 69 67 6e 6f 72 69 6e 67 20     ;;; ignoring 
1130: 72 65 73 75 6c 74 20 73 74 72 69 6e 67 0d 0a 20  result string.. 
1140: 20 20 20 20 20 20 20 20 28 77 69 74 68 2d 65 78          (with-ex
1150: 63 65 70 74 69 6f 6e 2d 68 61 6e 64 6c 65 72 20  ception-handler 
1160: 6b 20 74 68 75 6e 6b 29 0d 0a 20 20 20 20 20 20  k thunk)..      
1170: 20 20 20 28 65 72 72 6f 72 20 27 74 65 73 74 20     (error 'test 
1180: 22 64 69 64 20 6e 6f 74 20 66 61 69 6c 22 20 65  "did not fail" e
1190: 78 70 72 29 29 29 5d 0d 0a 20 20 20 20 5b 65 6c  xpr)))]..    [el
11a0: 73 65 0d 0a 20 20 20 20 20 28 75 6e 6c 65 73 73  se..     (unless
11b0: 20 28 65 71 75 61 6c 3f 20 72 65 73 75 6c 74 20   (equal? result 
11c0: 28 74 68 75 6e 6b 29 29 20 0d 0a 20 20 20 20 20  (thunk)) ..     
11d0: 20 20 28 65 72 72 6f 72 20 27 74 65 73 74 20 22    (error 'test "
11e0: 66 61 69 6c 65 64 22 20 65 78 70 72 29 29 5d 29  failed" expr))])
11f0: 29 0d 0a 0d 0a 28 64 65 66 69 6e 65 2d 73 79 6e  )....(define-syn
1200: 74 61 78 20 61 73 73 65 72 74 0d 0a 20 20 28 73  tax assert..  (s
1210: 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0d 0a  yntax-rules ()..
1220: 20 20 20 20 5b 28 5f 20 65 78 70 72 20 72 65 73      [(_ expr res
1230: 75 6c 74 29 20 0d 0a 20 20 20 20 20 28 68 61 6e  ult) ..     (han
1240: 64 6c 65 2d 61 73 73 65 72 74 69 6f 6e 20 28 6c  dle-assertion (l
1250: 61 6d 62 64 61 20 28 29 20 65 78 70 72 29 20 27  ambda () expr) '
1260: 65 78 70 72 20 72 65 73 75 6c 74 29 5d 29 29 0d  expr result)])).
1270: 0a 0d 0a 28 64 65 66 69 6e 65 20 28 75 6e 69 74  ...(define (unit
1280: 2d 74 65 73 74 29 0d 0a 20 20 0d 0a 20 20 28 64  -test)..  ..  (d
1290: 65 66 69 6e 65 20 73 74 72 6d 31 32 33 20 28 73  efine strm123 (s
12a0: 74 72 65 61 6d 20 31 20 32 20 33 29 29 0d 0a 0d  tream 1 2 3))...
12b0: 0a 20 20 3b 20 73 74 72 65 61 6d 2d 6e 75 6c 6c  .  ; stream-null
12c0: 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72  ..  (assert (str
12d0: 65 61 6d 3f 20 73 74 72 65 61 6d 2d 6e 75 6c 6c  eam? stream-null
12e0: 29 20 23 74 29 0d 0a 20 20 28 61 73 73 65 72 74  ) #t)..  (assert
12f0: 20 28 73 74 72 65 61 6d 2d 6e 75 6c 6c 3f 20 73   (stream-null? s
1300: 74 72 65 61 6d 2d 6e 75 6c 6c 29 20 23 74 29 0d  tream-null) #t).
1310: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
1320: 61 6d 2d 70 61 69 72 3f 20 73 74 72 65 61 6d 2d  am-pair? stream-
1330: 6e 75 6c 6c 29 20 23 66 29 0d 0a 20 20 0d 0a 20  null) #f)..  .. 
1340: 20 3b 20 73 74 72 65 61 6d 2d 63 6f 6e 73 0d 0a   ; stream-cons..
1350: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
1360: 6d 3f 20 28 73 74 72 65 61 6d 2d 63 6f 6e 73 20  m? (stream-cons 
1370: 31 20 73 74 72 65 61 6d 2d 6e 75 6c 6c 29 29 20  1 stream-null)) 
1380: 23 74 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28  #t)..  (assert (
1390: 73 74 72 65 61 6d 2d 6e 75 6c 6c 3f 20 28 73 74  stream-null? (st
13a0: 72 65 61 6d 2d 63 6f 6e 73 20 31 20 73 74 72 65  ream-cons 1 stre
13b0: 61 6d 2d 6e 75 6c 6c 29 29 20 23 66 29 0d 0a 20  am-null)) #f).. 
13c0: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
13d0: 2d 70 61 69 72 3f 20 28 73 74 72 65 61 6d 2d 63  -pair? (stream-c
13e0: 6f 6e 73 20 31 20 73 74 72 65 61 6d 2d 6e 75 6c  ons 1 stream-nul
13f0: 6c 29 29 20 23 74 29 0d 0a 20 20 0d 0a 20 20 3b  l)) #t)..  ..  ;
1400: 20 73 74 72 65 61 6d 3f 0d 0a 20 20 28 61 73 73   stream?..  (ass
1410: 65 72 74 20 28 73 74 72 65 61 6d 3f 20 73 74 72  ert (stream? str
1420: 65 61 6d 2d 6e 75 6c 6c 29 20 23 74 29 0d 0a 20  eam-null) #t).. 
1430: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
1440: 3f 20 28 73 74 72 65 61 6d 2d 63 6f 6e 73 20 31  ? (stream-cons 1
1450: 20 73 74 72 65 61 6d 2d 6e 75 6c 6c 29 29 20 23   stream-null)) #
1460: 74 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  t)..  (assert (s
1470: 74 72 65 61 6d 3f 20 22 66 6f 75 72 22 29 20 23  tream? "four") #
1480: 66 29 0d 0a 20 20 0d 0a 20 20 3b 20 73 74 72 65  f)..  ..  ; stre
1490: 61 6d 2d 6e 75 6c 6c 3f 0d 0a 20 20 28 61 73 73  am-null?..  (ass
14a0: 65 72 74 20 28 73 74 72 65 61 6d 2d 6e 75 6c 6c  ert (stream-null
14b0: 3f 20 73 74 72 65 61 6d 2d 6e 75 6c 6c 29 20 23  ? stream-null) #
14c0: 74 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  t)..  (assert (s
14d0: 74 72 65 61 6d 2d 6e 75 6c 6c 3f 20 28 73 74 72  tream-null? (str
14e0: 65 61 6d 2d 63 6f 6e 73 20 31 20 73 74 72 65 61  eam-cons 1 strea
14f0: 6d 2d 6e 75 6c 6c 29 29 20 23 66 29 0d 0a 20 20  m-null)) #f)..  
1500: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
1510: 6e 75 6c 6c 3f 20 22 66 6f 75 72 22 29 20 23 66  null? "four") #f
1520: 29 0d 0a 20 20 0d 0a 20 20 3b 20 73 74 72 65 61  )..  ..  ; strea
1530: 6d 2d 70 61 69 72 3f 0d 0a 20 20 28 61 73 73 65  m-pair?..  (asse
1540: 72 74 20 28 73 74 72 65 61 6d 2d 70 61 69 72 3f  rt (stream-pair?
1550: 20 73 74 72 65 61 6d 2d 6e 75 6c 6c 29 20 23 66   stream-null) #f
1560: 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74  )..  (assert (st
1570: 72 65 61 6d 2d 70 61 69 72 3f 20 28 73 74 72 65  ream-pair? (stre
1580: 61 6d 2d 63 6f 6e 73 20 31 20 73 74 72 65 61 6d  am-cons 1 stream
1590: 2d 6e 75 6c 6c 29 29 20 23 74 29 0d 0a 20 20 28  -null)) #t)..  (
15a0: 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 70  assert (stream-p
15b0: 61 69 72 3f 20 22 66 6f 75 72 22 29 20 23 66 29  air? "four") #f)
15c0: 0d 0a 20 20 0d 0a 20 20 3b 20 73 74 72 65 61 6d  ..  ..  ; stream
15d0: 2d 63 61 72 0d 0a 20 20 28 61 73 73 65 72 74 20  -car..  (assert 
15e0: 28 73 74 72 65 61 6d 2d 63 61 72 20 22 66 6f 75  (stream-car "fou
15f0: 72 22 29 20 22 73 74 72 65 61 6d 2d 63 61 72 3a  r") "stream-car:
1600: 20 6e 6f 6e 2d 73 74 72 65 61 6d 22 29 0d 0a 20   non-stream").. 
1610: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
1620: 2d 63 61 72 20 73 74 72 65 61 6d 2d 6e 75 6c 6c  -car stream-null
1630: 29 20 22 73 74 72 65 61 6d 2d 63 61 72 3a 20 6e  ) "stream-car: n
1640: 75 6c 6c 20 73 74 72 65 61 6d 22 29 0d 0a 20 20  ull stream")..  
1650: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
1660: 63 61 72 20 73 74 72 6d 31 32 33 29 20 31 29 0d  car strm123) 1).
1670: 0a 20 20 0d 0a 20 20 3b 20 73 74 72 65 61 6d 2d  .  ..  ; stream-
1680: 63 64 72 0d 0a 20 20 28 61 73 73 65 72 74 20 28  cdr..  (assert (
1690: 73 74 72 65 61 6d 2d 63 64 72 20 22 66 6f 75 72  stream-cdr "four
16a0: 22 29 20 22 73 74 72 65 61 6d 2d 63 64 72 3a 20  ") "stream-cdr: 
16b0: 6e 6f 6e 2d 73 74 72 65 61 6d 22 29 0d 0a 20 20  non-stream")..  
16c0: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
16d0: 63 64 72 20 73 74 72 65 61 6d 2d 6e 75 6c 6c 29  cdr stream-null)
16e0: 20 22 73 74 72 65 61 6d 2d 63 64 72 3a 20 6e 75   "stream-cdr: nu
16f0: 6c 6c 20 73 74 72 65 61 6d 22 29 0d 0a 20 20 28  ll stream")..  (
1700: 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 63  assert (stream-c
1710: 61 72 20 28 73 74 72 65 61 6d 2d 63 64 72 20 73  ar (stream-cdr s
1720: 74 72 6d 31 32 33 29 29 20 32 29 0d 0a 20 20 0d  trm123)) 2)..  .
1730: 0a 20 20 3b 20 73 74 72 65 61 6d 2d 6c 61 6d 62  .  ; stream-lamb
1740: 64 61 0d 0a 20 20 28 61 73 73 65 72 74 0d 0a 20  da..  (assert.. 
1750: 20 20 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74     (stream->list
1760: 0d 0a 20 20 20 20 20 20 28 6c 65 74 72 65 63 20  ..      (letrec 
1770: 28 28 64 6f 75 62 6c 65 0d 0a 20 20 20 20 20 20  ((double..      
1780: 20 20 28 73 74 72 65 61 6d 2d 6c 61 6d 62 64 61    (stream-lambda
1790: 20 28 73 74 72 6d 29 0d 0a 20 20 20 20 20 20 20   (strm)..       
17a0: 20 20 20 28 69 66 20 28 73 74 72 65 61 6d 2d 6e     (if (stream-n
17b0: 75 6c 6c 3f 20 73 74 72 6d 29 0d 0a 20 20 20 20  ull? strm)..    
17c0: 20 20 20 20 20 20 20 20 20 20 73 74 72 65 61 6d            stream
17d0: 2d 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  -null..         
17e0: 20 20 20 20 20 28 73 74 72 65 61 6d 2d 63 6f 6e       (stream-con
17f0: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
1800: 20 20 20 28 2a 20 32 20 28 73 74 72 65 61 6d 2d     (* 2 (stream-
1810: 63 61 72 20 73 74 72 6d 29 29 0d 0a 20 20 20 20  car strm))..    
1820: 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f 75              (dou
1830: 62 6c 65 20 28 73 74 72 65 61 6d 2d 63 64 72 20  ble (stream-cdr 
1840: 73 74 72 6d 29 29 29 29 29 29 29 0d 0a 20 20 20  strm)))))))..   
1850: 20 20 20 20 20 28 64 6f 75 62 6c 65 20 73 74 72       (double str
1860: 6d 31 32 33 29 29 29 0d 0a 20 20 20 20 27 28 32  m123)))..    '(2
1870: 20 34 20 36 29 29 0d 0a 20 20 0d 0a 20 20 3b 20   4 6))..  ..  ; 
1880: 64 65 66 69 6e 65 2d 73 74 72 65 61 6d 0d 0a 20  define-stream.. 
1890: 20 28 61 73 73 65 72 74 0d 0a 20 20 20 20 28 73   (assert..    (s
18a0: 74 72 65 61 6d 2d 3e 6c 69 73 74 0d 0a 20 20 20  tream->list..   
18b0: 20 20 20 28 6c 65 74 20 28 29 0d 0a 20 20 20 20     (let ()..    
18c0: 20 20 20 20 28 64 65 66 69 6e 65 2d 73 74 72 65      (define-stre
18d0: 61 6d 20 28 64 6f 75 62 6c 65 20 73 74 72 6d 29  am (double strm)
18e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 28 69 66 20  ..          (if 
18f0: 28 73 74 72 65 61 6d 2d 6e 75 6c 6c 3f 20 73 74  (stream-null? st
1900: 72 6d 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rm)..           
1910: 20 20 20 73 74 72 65 61 6d 2d 6e 75 6c 6c 0d 0a     stream-null..
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1930: 74 72 65 61 6d 2d 63 6f 6e 73 0d 0a 20 20 20 20  tream-cons..    
1940: 20 20 20 20 20 20 20 20 20 20 20 20 28 2a 20 32              (* 2
1950: 20 28 73 74 72 65 61 6d 2d 63 61 72 20 73 74 72   (stream-car str
1960: 6d 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  m))..           
1970: 20 20 20 20 20 28 64 6f 75 62 6c 65 20 28 73 74       (double (st
1980: 72 65 61 6d 2d 63 64 72 20 73 74 72 6d 29 29 29  ream-cdr strm)))
1990: 29 29 0d 0a 20 20 20 20 20 20 20 20 28 64 6f 75  ))..        (dou
19a0: 62 6c 65 20 73 74 72 6d 31 32 33 29 29 29 0d 0a  ble strm123)))..
19b0: 20 20 20 20 27 28 32 20 34 20 36 29 29 0d 0a 20      '(2 4 6)).. 
19c0: 20 0d 0a 20 20 3b 20 6c 69 73 74 2d 3e 73 74 72   ..  ; list->str
19d0: 65 61 6d 0d 0a 20 20 28 61 73 73 65 72 74 20 28  eam..  (assert (
19e0: 6c 69 73 74 2d 3e 73 74 72 65 61 6d 20 22 66 6f  list->stream "fo
19f0: 75 72 22 29 20 22 6c 69 73 74 2d 3e 73 74 72 65  ur") "list->stre
1a00: 61 6d 3a 20 6e 6f 6e 2d 6c 69 73 74 20 61 72 67  am: non-list arg
1a10: 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73 73 65  ument")..  (asse
1a20: 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74  rt (stream->list
1a30: 20 28 6c 69 73 74 2d 3e 73 74 72 65 61 6d 20 27   (list->stream '
1a40: 28 29 29 29 20 27 28 29 29 0d 0a 20 20 28 61 73  ())) '())..  (as
1a50: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69  sert (stream->li
1a60: 73 74 20 28 6c 69 73 74 2d 3e 73 74 72 65 61 6d  st (list->stream
1a70: 20 27 28 31 20 32 20 33 29 29 29 20 27 28 31 20   '(1 2 3))) '(1 
1a80: 32 20 33 29 29 0d 0a 20 20 0d 0a 20 20 3b 20 70  2 3))..  ..  ; p
1a90: 6f 72 74 2d 3e 73 74 72 65 61 6d 0d 0a 20 20 3b  ort->stream..  ;
1aa0: 3b 20 28 6c 65 74 2a 20 28 28 70 20 28 6f 70 65  ; (let* ((p (ope
1ab0: 6e 2d 69 6e 70 75 74 2d 66 69 6c 65 20 22 73 74  n-input-file "st
1ac0: 72 65 61 6d 73 2e 73 73 22 29 29 0d 0a 20 20 3b  reams.ss"))..  ;
1ad0: 3b 20 20 20 20 20 20 20 20 28 73 20 28 70 6f 72  ;        (s (por
1ae0: 74 2d 3e 73 74 72 65 61 6d 20 70 29 29 29 0d 0a  t->stream p)))..
1af0: 20 20 3b 3b 20 20 20 28 61 73 73 65 72 74 20 28    ;;   (assert (
1b00: 70 6f 72 74 2d 3e 73 74 72 65 61 6d 20 22 66 6f  port->stream "fo
1b10: 75 72 22 29 20 22 70 6f 72 74 2d 3e 73 74 72 65  ur") "port->stre
1b20: 61 6d 3a 20 6e 6f 6e 2d 69 6e 70 75 74 2d 70 6f  am: non-input-po
1b30: 72 74 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20  rt argument").. 
1b40: 20 3b 3b 20 20 20 28 61 73 73 65 72 74 20 28 73   ;;   (assert (s
1b50: 74 72 69 6e 67 3d 3f 20 28 6c 69 73 74 2d 3e 73  tring=? (list->s
1b60: 74 72 69 6e 67 20 28 73 74 72 65 61 6d 2d 3e 6c  tring (stream->l
1b70: 69 73 74 20 31 31 20 73 29 29 20 22 3b 20 43 6f  ist 11 s)) "; Co
1b80: 70 79 72 69 67 68 74 22 29 20 23 74 29 0d 0a 20  pyright") #t).. 
1b90: 20 3b 3b 20 20 20 28 63 6c 6f 73 65 2d 69 6e 70   ;;   (close-inp
1ba0: 75 74 2d 70 6f 72 74 20 70 29 29 0d 0a 0d 0a 20  ut-port p)).... 
1bb0: 20 3b 20 73 74 72 65 61 6d 0d 0a 20 20 28 61 73   ; stream..  (as
1bc0: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69  sert (stream->li
1bd0: 73 74 20 28 73 74 72 65 61 6d 29 29 20 27 28 29  st (stream)) '()
1be0: 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74  )..  (assert (st
1bf0: 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65  ream->list (stre
1c00: 61 6d 20 31 29 29 20 27 28 31 29 29 0d 0a 20 20  am 1)) '(1))..  
1c10: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
1c20: 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 20 31 20  >list (stream 1 
1c30: 32 20 33 29 29 20 27 28 31 20 32 20 33 29 29 0d  2 3)) '(1 2 3)).
1c40: 0a 20 20 0d 0a 20 20 3b 20 73 74 72 65 61 6d 2d  .  ..  ; stream-
1c50: 3e 6c 69 73 74 0d 0a 20 20 28 61 73 73 65 72 74  >list..  (assert
1c60: 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 27   (stream->list '
1c70: 28 29 29 20 22 73 74 72 65 61 6d 2d 3e 6c 69 73  ()) "stream->lis
1c80: 74 3a 20 6e 6f 6e 2d 73 74 72 65 61 6d 20 61 72  t: non-stream ar
1c90: 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73 73  gument")..  (ass
1ca0: 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73  ert (stream->lis
1cb0: 74 20 22 66 6f 75 72 22 20 73 74 72 6d 31 32 33  t "four" strm123
1cc0: 29 20 22 73 74 72 65 61 6d 2d 3e 6c 69 73 74 3a  ) "stream->list:
1cd0: 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 75   non-integer cou
1ce0: 6e 74 22 29 0d 0a 20 20 28 61 73 73 65 72 74 20  nt")..  (assert 
1cf0: 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 2d 31  (stream->list -1
1d00: 20 73 74 72 6d 31 32 33 29 20 22 73 74 72 65 61   strm123) "strea
1d10: 6d 2d 3e 6c 69 73 74 3a 20 6e 65 67 61 74 69 76  m->list: negativ
1d20: 65 20 63 6f 75 6e 74 22 29 0d 0a 20 20 28 61 73  e count")..  (as
1d30: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69  sert (stream->li
1d40: 73 74 20 28 73 74 72 65 61 6d 29 29 20 27 28 29  st (stream)) '()
1d50: 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74  )..  (assert (st
1d60: 72 65 61 6d 2d 3e 6c 69 73 74 20 73 74 72 6d 31  ream->list strm1
1d70: 32 33 29 20 27 28 31 20 32 20 33 29 29 0d 0a 20  23) '(1 2 3)).. 
1d80: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
1d90: 2d 3e 6c 69 73 74 20 35 20 73 74 72 6d 31 32 33  ->list 5 strm123
1da0: 29 20 27 28 31 20 32 20 33 29 29 0d 0a 20 20 28  ) '(1 2 3))..  (
1db0: 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e  assert (stream->
1dc0: 6c 69 73 74 20 33 20 28 73 74 72 65 61 6d 2d 66  list 3 (stream-f
1dd0: 72 6f 6d 20 31 29 29 20 27 28 31 20 32 20 33 29  rom 1)) '(1 2 3)
1de0: 29 0d 0a 20 20 0d 0a 20 20 3b 20 73 74 72 65 61  )..  ..  ; strea
1df0: 6d 2d 61 70 70 65 6e 64 0d 0a 20 20 28 61 73 73  m-append..  (ass
1e00: 65 72 74 20 28 73 74 72 65 61 6d 2d 61 70 70 65  ert (stream-appe
1e10: 6e 64 20 22 66 6f 75 72 22 29 20 22 73 74 72 65  nd "four") "stre
1e20: 61 6d 2d 61 70 70 65 6e 64 3a 20 6e 6f 6e 2d 73  am-append: non-s
1e30: 74 72 65 61 6d 20 61 72 67 75 6d 65 6e 74 22 29  tream argument")
1e40: 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72  ..  (assert (str
1e50: 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61  eam->list (strea
1e60: 6d 2d 61 70 70 65 6e 64 20 73 74 72 6d 31 32 33  m-append strm123
1e70: 29 29 20 27 28 31 20 32 20 33 29 29 0d 0a 20 20  )) '(1 2 3))..  
1e80: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
1e90: 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d 61 70  >list (stream-ap
1ea0: 70 65 6e 64 20 73 74 72 6d 31 32 33 20 73 74 72  pend strm123 str
1eb0: 6d 31 32 33 29 29 20 27 28 31 20 32 20 33 20 31  m123)) '(1 2 3 1
1ec0: 20 32 20 33 29 29 0d 0a 20 20 28 61 73 73 65 72   2 3))..  (asser
1ed0: 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20  t (stream->list 
1ee0: 28 73 74 72 65 61 6d 2d 61 70 70 65 6e 64 20 73  (stream-append s
1ef0: 74 72 6d 31 32 33 20 73 74 72 6d 31 32 33 20 73  trm123 strm123 s
1f00: 74 72 6d 31 32 33 29 29 20 27 28 31 20 32 20 33  trm123)) '(1 2 3
1f10: 20 31 20 32 20 33 20 31 20 32 20 33 29 29 0d 0a   1 2 3 1 2 3))..
1f20: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
1f30: 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d  m->list (stream-
1f40: 61 70 70 65 6e 64 20 73 74 72 6d 31 32 33 20 73  append strm123 s
1f50: 74 72 65 61 6d 2d 6e 75 6c 6c 29 29 20 27 28 31  tream-null)) '(1
1f60: 20 32 20 33 29 29 0d 0a 20 20 28 61 73 73 65 72   2 3))..  (asser
1f70: 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20  t (stream->list 
1f80: 28 73 74 72 65 61 6d 2d 61 70 70 65 6e 64 20 73  (stream-append s
1f90: 74 72 65 61 6d 2d 6e 75 6c 6c 20 73 74 72 6d 31  tream-null strm1
1fa0: 32 33 29 29 20 27 28 31 20 32 20 33 29 29 0d 0a  23)) '(1 2 3))..
1fb0: 20 20 0d 0a 20 20 3b 20 73 74 72 65 61 6d 2d 63    ..  ; stream-c
1fc0: 6f 6e 63 61 74 0d 0a 20 20 28 61 73 73 65 72 74  oncat..  (assert
1fd0: 20 28 73 74 72 65 61 6d 2d 63 6f 6e 63 61 74 20   (stream-concat 
1fe0: 22 66 6f 75 72 22 29 20 22 73 74 72 65 61 6d 2d  "four") "stream-
1ff0: 63 6f 6e 63 61 74 3a 20 6e 6f 6e 2d 73 74 72 65  concat: non-stre
2000: 61 6d 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20  am argument").. 
2010: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
2020: 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d 63  ->list (stream-c
2030: 6f 6e 63 61 74 20 28 73 74 72 65 61 6d 20 73 74  oncat (stream st
2040: 72 6d 31 32 33 29 29 29 20 27 28 31 20 32 20 33  rm123))) '(1 2 3
2050: 29 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  ))..  (assert (s
2060: 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72  tream->list (str
2070: 65 61 6d 2d 63 6f 6e 63 61 74 20 28 73 74 72 65  eam-concat (stre
2080: 61 6d 20 73 74 72 6d 31 32 33 20 73 74 72 6d 31  am strm123 strm1
2090: 32 33 29 29 29 20 27 28 31 20 32 20 33 20 31 20  23))) '(1 2 3 1 
20a0: 32 20 33 29 29 0d 0a 20 20 0d 0a 20 20 3b 20 73  2 3))..  ..  ; s
20b0: 74 72 65 61 6d 2d 63 6f 6e 73 74 61 6e 74 0d 0a  tream-constant..
20c0: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
20d0: 6d 2d 72 65 66 20 28 73 74 72 65 61 6d 2d 63 6f  m-ref (stream-co
20e0: 6e 73 74 61 6e 74 20 31 29 20 31 30 30 29 20 31  nstant 1) 100) 1
20f0: 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74  )..  (assert (st
2100: 72 65 61 6d 2d 72 65 66 20 28 73 74 72 65 61 6d  ream-ref (stream
2110: 2d 63 6f 6e 73 74 61 6e 74 20 31 20 32 29 20 31  -constant 1 2) 1
2120: 30 30 29 20 31 29 0d 0a 20 20 28 61 73 73 65 72  00) 1)..  (asser
2130: 74 20 28 73 74 72 65 61 6d 2d 72 65 66 20 28 73  t (stream-ref (s
2140: 74 72 65 61 6d 2d 63 6f 6e 73 74 61 6e 74 20 31  tream-constant 1
2150: 20 32 20 33 29 20 33 29 20 31 29 0d 0a 20 20 0d   2 3) 3) 1)..  .
2160: 0a 20 20 3b 20 73 74 72 65 61 6d 2d 64 72 6f 70  .  ; stream-drop
2170: 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72  ..  (assert (str
2180: 65 61 6d 2d 64 72 6f 70 20 22 66 6f 75 72 22 20  eam-drop "four" 
2190: 73 74 72 6d 31 32 33 29 20 22 73 74 72 65 61 6d  strm123) "stream
21a0: 2d 64 72 6f 70 3a 20 6e 6f 6e 2d 69 6e 74 65 67  -drop: non-integ
21b0: 65 72 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20  er argument").. 
21c0: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
21d0: 2d 64 72 6f 70 20 2d 31 20 73 74 72 6d 31 32 33  -drop -1 strm123
21e0: 29 20 22 73 74 72 65 61 6d 2d 64 72 6f 70 3a 20  ) "stream-drop: 
21f0: 6e 65 67 61 74 69 76 65 20 61 72 67 75 6d 65 6e  negative argumen
2200: 74 22 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28  t")..  (assert (
2210: 73 74 72 65 61 6d 2d 64 72 6f 70 20 32 20 22 66  stream-drop 2 "f
2220: 6f 75 72 22 29 20 22 73 74 72 65 61 6d 2d 64 72  our") "stream-dr
2230: 6f 70 3a 20 6e 6f 6e 2d 73 74 72 65 61 6d 20 61  op: non-stream a
2240: 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73  rgument")..  (as
2250: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69  sert (stream->li
2260: 73 74 20 28 73 74 72 65 61 6d 2d 64 72 6f 70 20  st (stream-drop 
2270: 30 20 73 74 72 65 61 6d 2d 6e 75 6c 6c 29 29 20  0 stream-null)) 
2280: 27 28 29 29 0d 0a 20 20 28 61 73 73 65 72 74 20  '())..  (assert 
2290: 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73  (stream->list (s
22a0: 74 72 65 61 6d 2d 64 72 6f 70 20 30 20 73 74 72  tream-drop 0 str
22b0: 6d 31 32 33 29 29 20 27 28 31 20 32 20 33 29 29  m123)) '(1 2 3))
22c0: 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72  ..  (assert (str
22d0: 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61  eam->list (strea
22e0: 6d 2d 64 72 6f 70 20 31 20 73 74 72 6d 31 32 33  m-drop 1 strm123
22f0: 29 29 20 27 28 32 20 33 29 29 0d 0a 20 20 28 61  )) '(2 3))..  (a
2300: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c  ssert (stream->l
2310: 69 73 74 20 28 73 74 72 65 61 6d 2d 64 72 6f 70  ist (stream-drop
2320: 20 35 20 73 74 72 6d 31 32 33 29 29 20 27 28 29   5 strm123)) '()
2330: 29 0d 0a 20 20 0d 0a 20 20 3b 20 73 74 72 65 61  )..  ..  ; strea
2340: 6d 2d 64 72 6f 70 2d 77 68 69 6c 65 0d 0a 20 20  m-drop-while..  
2350: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
2360: 64 72 6f 70 2d 77 68 69 6c 65 20 22 66 6f 75 72  drop-while "four
2370: 22 20 73 74 72 6d 31 32 33 29 20 22 73 74 72 65  " strm123) "stre
2380: 61 6d 2d 64 72 6f 70 2d 77 68 69 6c 65 3a 20 6e  am-drop-while: n
2390: 6f 6e 2d 70 72 6f 63 65 64 75 72 61 6c 20 61 72  on-procedural ar
23a0: 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73 73  gument")..  (ass
23b0: 65 72 74 20 28 73 74 72 65 61 6d 2d 64 72 6f 70  ert (stream-drop
23c0: 2d 77 68 69 6c 65 20 6f 64 64 3f 20 22 66 6f 75  -while odd? "fou
23d0: 72 22 29 20 22 73 74 72 65 61 6d 2d 64 72 6f 70  r") "stream-drop
23e0: 2d 77 68 69 6c 65 3a 20 6e 6f 6e 2d 73 74 72 65  -while: non-stre
23f0: 61 6d 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20  am argument").. 
2400: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
2410: 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d 64  ->list (stream-d
2420: 72 6f 70 2d 77 68 69 6c 65 20 6f 64 64 3f 20 73  rop-while odd? s
2430: 74 72 65 61 6d 2d 6e 75 6c 6c 29 29 20 27 28 29  tream-null)) '()
2440: 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74  )..  (assert (st
2450: 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65  ream->list (stre
2460: 61 6d 2d 64 72 6f 70 2d 77 68 69 6c 65 20 6f 64  am-drop-while od
2470: 64 3f 20 73 74 72 6d 31 32 33 29 29 20 27 28 32  d? strm123)) '(2
2480: 20 33 29 29 0d 0a 20 20 28 61 73 73 65 72 74 20   3))..  (assert 
2490: 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73  (stream->list (s
24a0: 74 72 65 61 6d 2d 64 72 6f 70 2d 77 68 69 6c 65  tream-drop-while
24b0: 20 65 76 65 6e 3f 20 73 74 72 6d 31 32 33 29 29   even? strm123))
24c0: 20 27 28 31 20 32 20 33 29 29 0d 0a 20 20 28 61   '(1 2 3))..  (a
24d0: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c  ssert (stream->l
24e0: 69 73 74 20 28 73 74 72 65 61 6d 2d 64 72 6f 70  ist (stream-drop
24f0: 2d 77 68 69 6c 65 20 70 6f 73 69 74 69 76 65 3f  -while positive?
2500: 20 73 74 72 6d 31 32 33 29 29 20 27 28 29 29 0d   strm123)) '()).
2510: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
2520: 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d  am->list (stream
2530: 2d 64 72 6f 70 2d 77 68 69 6c 65 20 6e 65 67 61  -drop-while nega
2540: 74 69 76 65 3f 20 73 74 72 6d 31 32 33 29 29 20  tive? strm123)) 
2550: 27 28 31 20 32 20 33 29 29 0d 0a 20 20 0d 0a 20  '(1 2 3))..  .. 
2560: 20 3b 20 73 74 72 65 61 6d 2d 66 69 6c 74 65 72   ; stream-filter
2570: 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72  ..  (assert (str
2580: 65 61 6d 2d 66 69 6c 74 65 72 20 22 66 6f 75 72  eam-filter "four
2590: 22 20 73 74 72 6d 31 32 33 29 20 22 73 74 72 65  " strm123) "stre
25a0: 61 6d 2d 66 69 6c 74 65 72 3a 20 6e 6f 6e 2d 70  am-filter: non-p
25b0: 72 6f 63 65 64 75 72 61 6c 20 61 72 67 75 6d 65  rocedural argume
25c0: 6e 74 22 29 0d 0a 20 20 28 61 73 73 65 72 74 20  nt")..  (assert 
25d0: 28 73 74 72 65 61 6d 2d 66 69 6c 74 65 72 20 6f  (stream-filter o
25e0: 64 64 3f 20 27 28 29 29 20 22 73 74 72 65 61 6d  dd? '()) "stream
25f0: 2d 66 69 6c 74 65 72 3a 20 6e 6f 6e 2d 73 74 72  -filter: non-str
2600: 65 61 6d 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a  eam argument")..
2610: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
2620: 6d 2d 6e 75 6c 6c 3f 20 28 73 74 72 65 61 6d 2d  m-null? (stream-
2630: 66 69 6c 74 65 72 20 6f 64 64 3f 20 28 73 74 72  filter odd? (str
2640: 65 61 6d 29 29 29 20 23 74 29 0d 0a 20 20 28 61  eam))) #t)..  (a
2650: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c  ssert (stream->l
2660: 69 73 74 20 28 73 74 72 65 61 6d 2d 66 69 6c 74  ist (stream-filt
2670: 65 72 20 6f 64 64 3f 20 73 74 72 6d 31 32 33 29  er odd? strm123)
2680: 29 20 27 28 31 20 33 29 29 0d 0a 20 20 28 61 73  ) '(1 3))..  (as
2690: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69  sert (stream->li
26a0: 73 74 20 28 73 74 72 65 61 6d 2d 66 69 6c 74 65  st (stream-filte
26b0: 72 20 65 76 65 6e 3f 20 73 74 72 6d 31 32 33 29  r even? strm123)
26c0: 29 20 27 28 32 29 29 0d 0a 20 20 28 61 73 73 65  ) '(2))..  (asse
26d0: 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74  rt (stream->list
26e0: 20 28 73 74 72 65 61 6d 2d 66 69 6c 74 65 72 20   (stream-filter 
26f0: 70 6f 73 69 74 69 76 65 3f 20 73 74 72 6d 31 32  positive? strm12
2700: 33 29 29 20 27 28 31 20 32 20 33 29 29 0d 0a 20  3)) '(1 2 3)).. 
2710: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
2720: 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d 66  ->list (stream-f
2730: 69 6c 74 65 72 20 6e 65 67 61 74 69 76 65 3f 20  ilter negative? 
2740: 73 74 72 6d 31 32 33 29 29 20 27 28 29 29 0d 0a  strm123)) '())..
2750: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6e 20    (let loop ((n 
2760: 31 30 29 29 0d 0a 20 20 20 20 28 61 73 73 65 72  10))..    (asser
2770: 74 20 28 6f 64 64 3f 20 28 73 74 72 65 61 6d 2d  t (odd? (stream-
2780: 72 65 66 20 28 73 74 72 65 61 6d 2d 66 69 6c 74  ref (stream-filt
2790: 65 72 20 6f 64 64 3f 20 28 73 74 72 65 61 6d 2d  er odd? (stream-
27a0: 66 72 6f 6d 20 30 29 29 20 6e 29 29 20 23 74 29  from 0)) n)) #t)
27b0: 0d 0a 20 20 20 20 28 69 66 20 28 70 6f 73 69 74  ..    (if (posit
27c0: 69 76 65 3f 20 6e 29 20 28 6c 6f 6f 70 20 28 2d  ive? n) (loop (-
27d0: 20 6e 20 31 29 29 29 29 0d 0a 20 20 28 6c 65 74   n 1))))..  (let
27e0: 20 6c 6f 6f 70 20 28 28 6e 20 31 30 29 29 0d 0a   loop ((n 10))..
27f0: 20 20 20 20 28 61 73 73 65 72 74 20 28 65 76 65      (assert (eve
2800: 6e 3f 20 28 73 74 72 65 61 6d 2d 72 65 66 20 28  n? (stream-ref (
2810: 73 74 72 65 61 6d 2d 66 69 6c 74 65 72 20 6f 64  stream-filter od
2820: 64 3f 20 28 73 74 72 65 61 6d 2d 66 72 6f 6d 20  d? (stream-from 
2830: 30 29 29 20 6e 29 29 20 23 66 29 0d 0a 20 20 20  0)) n)) #f)..   
2840: 20 28 69 66 20 28 70 6f 73 69 74 69 76 65 3f 20   (if (positive? 
2850: 6e 29 20 28 6c 6f 6f 70 20 28 2d 20 6e 20 31 29  n) (loop (- n 1)
2860: 29 29 29 0d 0a 20 20 0d 0a 20 20 3b 20 73 74 72  )))..  ..  ; str
2870: 65 61 6d 2d 66 6f 6c 64 0d 0a 20 20 28 61 73 73  eam-fold..  (ass
2880: 65 72 74 20 28 73 74 72 65 61 6d 2d 66 6f 6c 64  ert (stream-fold
2890: 20 22 66 6f 75 72 22 20 30 20 73 74 72 6d 31 32   "four" 0 strm12
28a0: 33 29 20 22 73 74 72 65 61 6d 2d 66 6f 6c 64 3a  3) "stream-fold:
28b0: 20 6e 6f 6e 2d 70 72 6f 63 65 64 75 72 61 6c 20   non-procedural 
28c0: 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61  argument")..  (a
28d0: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 66 6f  ssert (stream-fo
28e0: 6c 64 20 2b 20 30 20 27 28 29 29 20 22 73 74 72  ld + 0 '()) "str
28f0: 65 61 6d 2d 66 6f 6c 64 3a 20 6e 6f 6e 2d 73 74  eam-fold: non-st
2900: 72 65 61 6d 20 61 72 67 75 6d 65 6e 74 22 29 0d  ream argument").
2910: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
2920: 61 6d 2d 66 6f 6c 64 20 2b 20 30 20 73 74 72 6d  am-fold + 0 strm
2930: 31 32 33 29 20 36 29 0d 0a 20 20 0d 0a 20 20 3b  123) 6)..  ..  ;
2940: 20 73 74 72 65 61 6d 2d 66 6f 72 2d 65 61 63 68   stream-for-each
2950: 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72  ..  (assert (str
2960: 65 61 6d 2d 66 6f 72 2d 65 61 63 68 20 22 66 6f  eam-for-each "fo
2970: 75 72 22 20 73 74 72 6d 31 32 33 29 20 22 73 74  ur" strm123) "st
2980: 72 65 61 6d 2d 66 6f 72 2d 65 61 63 68 3a 20 6e  ream-for-each: n
2990: 6f 6e 2d 70 72 6f 63 65 64 75 72 61 6c 20 61 72  on-procedural ar
29a0: 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73 73  gument")..  (ass
29b0: 65 72 74 20 28 73 74 72 65 61 6d 2d 66 6f 72 2d  ert (stream-for-
29c0: 65 61 63 68 20 64 69 73 70 6c 61 79 29 20 22 73  each display) "s
29d0: 74 72 65 61 6d 2d 66 6f 72 2d 65 61 63 68 3a 20  tream-for-each: 
29e0: 6e 6f 20 73 74 72 65 61 6d 20 61 72 67 75 6d 65  no stream argume
29f0: 6e 74 73 22 29 0d 0a 20 20 28 61 73 73 65 72 74  nts")..  (assert
2a00: 20 28 73 74 72 65 61 6d 2d 66 6f 72 2d 65 61 63   (stream-for-eac
2a10: 68 20 64 69 73 70 6c 61 79 20 22 66 6f 75 72 22  h display "four"
2a20: 29 20 22 73 74 72 65 61 6d 2d 66 6f 72 2d 65 61  ) "stream-for-ea
2a30: 63 68 3a 20 6e 6f 6e 2d 73 74 72 65 61 6d 20 61  ch: non-stream a
2a40: 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73  rgument")..  (as
2a50: 73 65 72 74 20 28 6c 65 74 20 28 28 73 75 6d 20  sert (let ((sum 
2a60: 30 29 29 20 28 73 74 72 65 61 6d 2d 66 6f 72 2d  0)) (stream-for-
2a70: 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 78 29  each (lambda (x)
2a80: 20 28 73 65 74 21 20 73 75 6d 20 28 2b 20 73 75   (set! sum (+ su
2a90: 6d 20 78 29 29 29 20 73 74 72 6d 31 32 33 29 20  m x))) strm123) 
2aa0: 73 75 6d 29 20 36 29 0d 0a 0d 0a 20 20 3b 20 73  sum) 6)....  ; s
2ab0: 74 72 65 61 6d 2d 66 72 6f 6d 0d 0a 20 20 28 61  tream-from..  (a
2ac0: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 66 72  ssert (stream-fr
2ad0: 6f 6d 20 22 66 6f 75 72 22 29 20 22 73 74 72 65  om "four") "stre
2ae0: 61 6d 2d 66 72 6f 6d 3a 20 6e 6f 6e 2d 6e 75 6d  am-from: non-num
2af0: 65 72 69 63 20 73 74 61 72 74 69 6e 67 20 6e 75  eric starting nu
2b00: 6d 62 65 72 22 29 0d 0a 20 20 28 61 73 73 65 72  mber")..  (asser
2b10: 74 20 28 73 74 72 65 61 6d 2d 66 72 6f 6d 20 31  t (stream-from 1
2b20: 20 22 66 6f 75 72 22 29 20 22 73 74 72 65 61 6d   "four") "stream
2b30: 2d 66 72 6f 6d 3a 20 6e 6f 6e 2d 6e 75 6d 65 72  -from: non-numer
2b40: 69 63 20 73 74 65 70 20 73 69 7a 65 22 29 0d 0a  ic step size")..
2b50: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
2b60: 6d 2d 72 65 66 20 28 73 74 72 65 61 6d 2d 66 72  m-ref (stream-fr
2b70: 6f 6d 20 30 29 20 31 30 30 29 20 31 30 30 29 0d  om 0) 100) 100).
2b80: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
2b90: 61 6d 2d 72 65 66 20 28 73 74 72 65 61 6d 2d 66  am-ref (stream-f
2ba0: 72 6f 6d 20 31 20 32 29 20 31 30 30 29 20 32 30  rom 1 2) 100) 20
2bb0: 31 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  1)..  (assert (s
2bc0: 74 72 65 61 6d 2d 72 65 66 20 28 73 74 72 65 61  tream-ref (strea
2bd0: 6d 2d 66 72 6f 6d 20 30 20 2d 31 29 20 31 30 30  m-from 0 -1) 100
2be0: 29 20 2d 31 30 30 29 0d 0a 20 20 0d 0a 20 20 3b  ) -100)..  ..  ;
2bf0: 20 73 74 72 65 61 6d 2d 69 74 65 72 61 74 65 0d   stream-iterate.
2c00: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
2c10: 61 6d 2d 69 74 65 72 61 74 65 20 22 66 6f 75 72  am-iterate "four
2c20: 22 20 30 29 20 22 73 74 72 65 61 6d 2d 69 74 65  " 0) "stream-ite
2c30: 72 61 74 65 3a 20 6e 6f 6e 2d 70 72 6f 63 65 64  rate: non-proced
2c40: 75 72 61 6c 20 61 72 67 75 6d 65 6e 74 22 29 0d  ural argument").
2c50: 0a 20 20 0d 0a 20 20 28 61 73 73 65 72 74 20 28  .  ..  (assert (
2c60: 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 33 20 28  stream->list 3 (
2c70: 73 74 72 65 61 6d 2d 69 74 65 72 61 74 65 20 28  stream-iterate (
2c80: 6c 73 65 63 20 2b 20 31 29 20 31 29 29 20 27 28  lsec + 1) 1)) '(
2c90: 31 20 32 20 33 29 29 0d 0a 20 20 0d 0a 20 20 3b  1 2 3))..  ..  ;
2ca0: 20 73 74 72 65 61 6d 2d 6c 65 6e 67 74 68 0d 0a   stream-length..
2cb0: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
2cc0: 6d 2d 6c 65 6e 67 74 68 20 22 66 6f 75 72 22 29  m-length "four")
2cd0: 20 22 73 74 72 65 61 6d 2d 6c 65 6e 67 74 68 3a   "stream-length:
2ce0: 20 6e 6f 6e 2d 73 74 72 65 61 6d 20 61 72 67 75   non-stream argu
2cf0: 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73 73 65 72  ment")..  (asser
2d00: 74 20 28 73 74 72 65 61 6d 2d 6c 65 6e 67 74 68  t (stream-length
2d10: 20 28 73 74 72 65 61 6d 29 29 20 30 29 0d 0a 20   (stream)) 0).. 
2d20: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
2d30: 2d 6c 65 6e 67 74 68 20 73 74 72 6d 31 32 33 29  -length strm123)
2d40: 20 33 29 0d 0a 20 20 0d 0a 20 20 3b 20 73 74 72   3)..  ..  ; str
2d50: 65 61 6d 2d 6c 65 74 0d 0a 20 20 28 61 73 73 65  eam-let..  (asse
2d60: 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74  rt (stream->list
2d70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73  ..            (s
2d80: 74 72 65 61 6d 2d 6c 65 74 20 6c 6f 6f 70 20 28  tream-let loop (
2d90: 28 73 74 72 6d 20 73 74 72 6d 31 32 33 29 29 0d  (strm strm123)).
2da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
2db0: 69 66 20 28 73 74 72 65 61 6d 2d 6e 75 6c 6c 3f  if (stream-null?
2dc0: 20 73 74 72 6d 29 0d 0a 20 20 20 20 20 20 20 20   strm)..        
2dd0: 20 20 20 20 20 20 20 20 20 20 73 74 72 65 61 6d            stream
2de0: 2d 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  -null..         
2df0: 20 20 20 20 20 20 20 20 20 28 73 74 72 65 61 6d           (stream
2e00: 2d 63 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  -cons..         
2e10: 20 20 20 20 20 20 20 20 20 20 20 28 2a 20 32 20             (* 2 
2e20: 28 73 74 72 65 61 6d 2d 63 61 72 20 73 74 72 6d  (stream-car strm
2e30: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
2e40: 20 20 20 20 20 20 20 20 28 6c 6f 6f 70 20 28 73          (loop (s
2e50: 74 72 65 61 6d 2d 63 64 72 20 73 74 72 6d 29 29  tream-cdr strm))
2e60: 29 29 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ))))..          
2e70: 27 28 32 20 34 20 36 29 29 0d 0a 20 20 0d 0a 20  '(2 4 6))..  .. 
2e80: 20 3b 20 73 74 72 65 61 6d 2d 6d 61 70 0d 0a 20   ; stream-map.. 
2e90: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
2ea0: 2d 6d 61 70 20 22 66 6f 75 72 22 20 73 74 72 6d  -map "four" strm
2eb0: 31 32 33 29 20 22 73 74 72 65 61 6d 2d 6d 61 70  123) "stream-map
2ec0: 3a 20 6e 6f 6e 2d 70 72 6f 63 65 64 75 72 61 6c  : non-procedural
2ed0: 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28   argument")..  (
2ee0: 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 6d  assert (stream-m
2ef0: 61 70 20 6f 64 64 3f 29 20 22 73 74 72 65 61 6d  ap odd?) "stream
2f00: 2d 6d 61 70 3a 20 6e 6f 20 73 74 72 65 61 6d 20  -map: no stream 
2f10: 61 72 67 75 6d 65 6e 74 73 22 29 0d 0a 20 20 28  arguments")..  (
2f20: 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 6d  assert (stream-m
2f30: 61 70 20 6f 64 64 3f 20 22 66 6f 75 72 22 29 20  ap odd? "four") 
2f40: 22 73 74 72 65 61 6d 2d 6d 61 70 3a 20 6e 6f 6e  "stream-map: non
2f50: 2d 73 74 72 65 61 6d 20 61 72 67 75 6d 65 6e 74  -stream argument
2f60: 22 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  ")..  (assert (s
2f70: 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72  tream->list (str
2f80: 65 61 6d 2d 6d 61 70 20 2d 20 73 74 72 6d 31 32  eam-map - strm12
2f90: 33 29 29 20 27 28 2d 31 20 2d 32 20 2d 33 29 29  3)) '(-1 -2 -3))
2fa0: 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72  ..  (assert (str
2fb0: 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61  eam->list (strea
2fc0: 6d 2d 6d 61 70 20 2b 20 73 74 72 6d 31 32 33 20  m-map + strm123 
2fd0: 73 74 72 6d 31 32 33 29 29 20 27 28 32 20 34 20  strm123)) '(2 4 
2fe0: 36 29 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28  6))..  (assert (
2ff0: 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74  stream->list (st
3000: 72 65 61 6d 2d 6d 61 70 20 2b 20 73 74 72 6d 31  ream-map + strm1
3010: 32 33 20 28 73 74 72 65 61 6d 2d 66 72 6f 6d 20  23 (stream-from 
3020: 31 29 29 29 20 27 28 32 20 34 20 36 29 29 0d 0a  1))) '(2 4 6))..
3030: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
3040: 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d  m->list (stream-
3050: 6d 61 70 20 2b 20 28 73 74 72 65 61 6d 2d 66 72  map + (stream-fr
3060: 6f 6d 20 31 29 20 73 74 72 6d 31 32 33 29 29 20  om 1) strm123)) 
3070: 27 28 32 20 34 20 36 29 29 0d 0a 20 20 28 61 73  '(2 4 6))..  (as
3080: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69  sert (stream->li
3090: 73 74 20 28 73 74 72 65 61 6d 2d 6d 61 70 20 2b  st (stream-map +
30a0: 20 73 74 72 6d 31 32 33 20 73 74 72 6d 31 32 33   strm123 strm123
30b0: 20 73 74 72 6d 31 32 33 29 29 20 27 28 33 20 36   strm123)) '(3 6
30c0: 20 39 29 29 0d 0a 20 20 0d 0a 20 20 3b 20 73 74   9))..  ..  ; st
30d0: 72 65 61 6d 2d 6d 61 74 63 68 0d 0a 20 20 28 61  ream-match..  (a
30e0: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 6d 61  ssert (stream-ma
30f0: 74 63 68 20 27 28 31 20 32 20 33 29 20 28 5f 20  tch '(1 2 3) (_ 
3100: 27 6f 6b 29 29 20 22 73 74 72 65 61 6d 2d 6d 61  'ok)) "stream-ma
3110: 74 63 68 3a 20 6e 6f 6e 2d 73 74 72 65 61 6d 20  tch: non-stream 
3120: 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61  argument")..  (a
3130: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 6d 61  ssert (stream-ma
3140: 74 63 68 20 73 74 72 6d 31 32 33 20 28 28 29 20  tch strm123 (() 
3150: 34 32 29 29 20 22 73 74 72 65 61 6d 2d 6d 61 74  42)) "stream-mat
3160: 63 68 3a 20 70 61 74 74 65 72 6e 20 66 61 69 6c  ch: pattern fail
3170: 75 72 65 22 29 0d 0a 20 20 28 61 73 73 65 72 74  ure")..  (assert
3180: 20 28 73 74 72 65 61 6d 2d 6d 61 74 63 68 20 73   (stream-match s
3190: 74 72 65 61 6d 2d 6e 75 6c 6c 20 28 28 29 20 27  tream-null (() '
31a0: 6f 6b 29 29 20 27 6f 6b 29 0d 0a 20 20 28 61 73  ok)) 'ok)..  (as
31b0: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 6d 61 74  sert (stream-mat
31c0: 63 68 20 73 74 72 6d 31 32 33 20 28 28 29 20 27  ch strm123 (() '
31d0: 6e 6f 29 20 28 65 6c 73 65 20 27 6f 6b 29 29 20  no) (else 'ok)) 
31e0: 27 6f 6b 29 0d 0a 20 20 28 61 73 73 65 72 74 20  'ok)..  (assert 
31f0: 28 73 74 72 65 61 6d 2d 6d 61 74 63 68 20 28 73  (stream-match (s
3200: 74 72 65 61 6d 20 31 29 20 28 28 29 20 27 6e 6f  tream 1) (() 'no
3210: 29 20 28 28 61 29 20 61 29 29 20 31 29 0d 0a 20  ) ((a) a)) 1).. 
3220: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
3230: 2d 6d 61 74 63 68 20 28 73 74 72 65 61 6d 20 31  -match (stream 1
3240: 29 20 28 28 29 20 27 6e 6f 29 20 28 28 5f 29 20  ) (() 'no) ((_) 
3250: 27 6f 6b 29 29 20 27 6f 6b 29 0d 0a 20 20 28 61  'ok)) 'ok)..  (a
3260: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 6d 61  ssert (stream-ma
3270: 74 63 68 20 73 74 72 6d 31 32 33 20 28 28 61 20  tch strm123 ((a 
3280: 62 20 63 29 20 28 6c 69 73 74 20 61 20 62 20 63  b c) (list a b c
3290: 29 29 29 20 27 28 31 20 32 20 33 29 29 0d 0a 20  ))) '(1 2 3)).. 
32a0: 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d   (assert (stream
32b0: 2d 6d 61 74 63 68 20 73 74 72 6d 31 32 33 20 28  -match strm123 (
32c0: 28 61 20 2e 20 5f 29 20 61 29 29 20 31 29 0d 0a  (a . _) a)) 1)..
32d0: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
32e0: 6d 2d 6d 61 74 63 68 20 73 74 72 6d 31 32 33 20  m-match strm123 
32f0: 28 28 61 20 62 20 2e 20 5f 29 20 28 6c 69 73 74  ((a b . _) (list
3300: 20 61 20 62 29 29 29 20 27 28 31 20 32 29 29 0d   a b))) '(1 2)).
3310: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
3320: 61 6d 2d 6d 61 74 63 68 20 73 74 72 6d 31 32 33  am-match strm123
3330: 20 28 28 61 20 62 20 2e 20 63 29 20 28 6c 69 73   ((a b . c) (lis
3340: 74 20 61 20 62 20 28 73 74 72 65 61 6d 2d 63 61  t a b (stream-ca
3350: 72 20 63 29 29 29 29 20 27 28 31 20 32 20 33 29  r c)))) '(1 2 3)
3360: 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74  )..  (assert (st
3370: 72 65 61 6d 2d 6d 61 74 63 68 20 73 74 72 6d 31  ream-match strm1
3380: 32 33 20 28 73 20 28 73 74 72 65 61 6d 2d 3e 6c  23 (s (stream->l
3390: 69 73 74 20 73 29 29 29 20 27 28 31 20 32 20 33  ist s))) '(1 2 3
33a0: 29 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  ))..  (assert (s
33b0: 74 72 65 61 6d 2d 6d 61 74 63 68 20 73 74 72 6d  tream-match strm
33c0: 31 32 33 20 28 28 61 20 2e 20 5f 29 20 28 3d 20  123 ((a . _) (= 
33d0: 61 20 31 29 20 27 6f 6b 29 29 20 27 6f 6b 29 0d  a 1) 'ok)) 'ok).
33e0: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
33f0: 61 6d 2d 6d 61 74 63 68 20 73 74 72 6d 31 32 33  am-match strm123
3400: 20 28 28 61 20 2e 20 5f 29 20 28 3d 20 61 20 32   ((a . _) (= a 2
3410: 29 20 27 79 65 73 29 20 28 5f 20 27 6e 6f 29 29  ) 'yes) (_ 'no))
3420: 20 27 6e 6f 29 0d 0a 20 20 28 61 73 73 65 72 74   'no)..  (assert
3430: 20 28 73 74 72 65 61 6d 2d 6d 61 74 63 68 20 73   (stream-match s
3440: 74 72 6d 31 32 33 20 28 28 61 20 62 20 63 29 20  trm123 ((a b c) 
3450: 28 3d 20 61 20 62 29 20 27 79 65 73 29 20 28 5f  (= a b) 'yes) (_
3460: 20 27 6e 6f 29 29 20 27 6e 6f 29 0d 0a 20 20 28   'no)) 'no)..  (
3470: 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 6d  assert (stream-m
3480: 61 74 63 68 20 28 73 74 72 65 61 6d 20 31 20 31  atch (stream 1 1
3490: 20 32 29 20 28 28 61 20 62 20 63 29 20 28 3d 20   2) ((a b c) (= 
34a0: 61 20 62 29 20 27 79 65 73 29 20 28 5f 20 27 6e  a b) 'yes) (_ 'n
34b0: 6f 29 29 20 27 79 65 73 29 0d 0a 20 20 0d 0a 20  o)) 'yes)..  .. 
34c0: 20 3b 20 73 74 72 65 61 6d 2d 6f 66 0d 0a 20 20   ; stream-of..  
34d0: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
34e0: 3e 6c 69 73 74 0d 0a 20 20 20 20 20 20 20 20 20  >list..         
34f0: 20 20 20 28 73 74 72 65 61 6d 2d 6f 66 20 28 2b     (stream-of (+
3500: 20 79 20 36 29 0d 0a 20 20 20 20 20 20 20 20 20   y 6)..         
3510: 20 20 20 20 20 28 78 20 69 6e 20 28 73 74 72 65       (x in (stre
3520: 61 6d 2d 72 61 6e 67 65 20 31 20 36 29 29 0d 0a  am-range 1 6))..
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f                (o
3540: 64 64 3f 20 78 29 0d 0a 20 20 20 20 20 20 20 20  dd? x)..        
3550: 20 20 20 20 20 20 28 79 20 69 73 20 28 2a 20 78        (y is (* x
3560: 20 78 29 29 29 29 20 27 28 37 20 31 35 20 33 31   x)))) '(7 15 31
3570: 29 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  ))..  (assert (s
3580: 74 72 65 61 6d 2d 3e 6c 69 73 74 0d 0a 20 20 20  tream->list..   
3590: 20 20 20 20 20 20 20 20 20 28 73 74 72 65 61 6d           (stream
35a0: 2d 6f 66 20 28 2a 20 78 20 79 29 0d 0a 20 20 20  -of (* x y)..   
35b0: 20 20 20 20 20 20 20 20 20 20 20 28 78 20 69 6e             (x in
35c0: 20 28 73 74 72 65 61 6d 2d 72 61 6e 67 65 20 31   (stream-range 1
35d0: 20 34 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20   4))..          
35e0: 20 20 20 20 28 79 20 69 6e 20 28 73 74 72 65 61      (y in (strea
35f0: 6d 2d 72 61 6e 67 65 20 31 20 35 29 29 29 29 0d  m-range 1 5)))).
3600: 0a 20 20 20 20 20 20 20 20 20 20 27 28 31 20 32  .          '(1 2
3610: 20 33 20 34 20 32 20 34 20 36 20 38 20 33 20 36   3 4 2 4 6 8 3 6
3620: 20 39 20 31 32 29 29 0d 0a 20 20 28 61 73 73 65   9 12))..  (asse
3630: 72 74 20 28 73 74 72 65 61 6d 2d 63 61 72 20 28  rt (stream-car (
3640: 73 74 72 65 61 6d 2d 6f 66 20 31 29 29 20 31 29  stream-of 1)) 1)
3650: 0d 0a 0d 0a 20 20 3b 20 73 74 72 65 61 6d 2d 72  ....  ; stream-r
3660: 61 6e 67 65 0d 0a 20 20 28 61 73 73 65 72 74 20  ange..  (assert 
3670: 28 73 74 72 65 61 6d 2d 72 61 6e 67 65 20 22 66  (stream-range "f
3680: 6f 75 72 22 20 30 29 20 22 73 74 72 65 61 6d 2d  our" 0) "stream-
3690: 72 61 6e 67 65 3a 20 6e 6f 6e 2d 6e 75 6d 65 72  range: non-numer
36a0: 69 63 20 73 74 61 72 74 69 6e 67 20 6e 75 6d 62  ic starting numb
36b0: 65 72 22 29 0d 0a 20 20 28 61 73 73 65 72 74 20  er")..  (assert 
36c0: 28 73 74 72 65 61 6d 2d 72 61 6e 67 65 20 30 20  (stream-range 0 
36d0: 22 66 6f 75 72 22 29 20 22 73 74 72 65 61 6d 2d  "four") "stream-
36e0: 72 61 6e 67 65 3a 20 6e 6f 6e 2d 6e 75 6d 65 72  range: non-numer
36f0: 69 63 20 65 6e 64 69 6e 67 20 6e 75 6d 62 65 72  ic ending number
3700: 22 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  ")..  (assert (s
3710: 74 72 65 61 6d 2d 72 61 6e 67 65 20 31 20 32 20  tream-range 1 2 
3720: 22 74 68 72 65 65 22 29 20 22 73 74 72 65 61 6d  "three") "stream
3730: 2d 72 61 6e 67 65 3a 20 6e 6f 6e 2d 6e 75 6d 65  -range: non-nume
3740: 72 69 63 20 73 74 65 70 20 73 69 7a 65 22 29 0d  ric step size").
3750: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
3760: 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d  am->list (stream
3770: 2d 72 61 6e 67 65 20 30 20 35 29 29 20 27 28 30  -range 0 5)) '(0
3780: 20 31 20 32 20 33 20 34 29 29 0d 0a 20 20 28 61   1 2 3 4))..  (a
3790: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c  ssert (stream->l
37a0: 69 73 74 20 28 73 74 72 65 61 6d 2d 72 61 6e 67  ist (stream-rang
37b0: 65 20 35 20 30 29 29 20 27 28 35 20 34 20 33 20  e 5 0)) '(5 4 3 
37c0: 32 20 31 29 29 0d 0a 20 20 28 61 73 73 65 72 74  2 1))..  (assert
37d0: 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28   (stream->list (
37e0: 73 74 72 65 61 6d 2d 72 61 6e 67 65 20 30 20 35  stream-range 0 5
37f0: 20 32 29 29 20 27 28 30 20 32 20 34 29 29 0d 0a   2)) '(0 2 4))..
3800: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
3810: 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d  m->list (stream-
3820: 72 61 6e 67 65 20 35 20 30 20 2d 32 29 29 20 27  range 5 0 -2)) '
3830: 28 35 20 33 20 31 29 29 0d 0a 20 20 28 61 73 73  (5 3 1))..  (ass
3840: 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73  ert (stream->lis
3850: 74 20 28 73 74 72 65 61 6d 2d 72 61 6e 67 65 20  t (stream-range 
3860: 30 20 31 20 2d 31 29 29 20 27 28 29 29 0d 0a 20  0 1 -1)) '()).. 
3870: 20 0d 0a 20 20 3b 20 73 74 72 65 61 6d 2d 72 65   ..  ; stream-re
3880: 66 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74  f..  (assert (st
3890: 72 65 61 6d 2d 72 65 66 20 27 28 29 20 34 29 20  ream-ref '() 4) 
38a0: 22 73 74 72 65 61 6d 2d 72 65 66 3a 20 6e 6f 6e  "stream-ref: non
38b0: 2d 73 74 72 65 61 6d 20 61 72 67 75 6d 65 6e 74  -stream argument
38c0: 22 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  ")..  (assert (s
38d0: 74 72 65 61 6d 2d 72 65 66 20 6e 61 74 73 20 33  tream-ref nats 3
38e0: 2e 35 29 20 22 73 74 72 65 61 6d 2d 72 65 66 3a  .5) "stream-ref:
38f0: 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 61 72 67   non-integer arg
3900: 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73 73 65  ument")..  (asse
3910: 72 74 20 28 73 74 72 65 61 6d 2d 72 65 66 20 6e  rt (stream-ref n
3920: 61 74 73 20 2d 33 29 20 22 73 74 72 65 61 6d 2d  ats -3) "stream-
3930: 72 65 66 3a 20 6e 65 67 61 74 69 76 65 20 61 72  ref: negative ar
3940: 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73 73  gument")..  (ass
3950: 65 72 74 20 28 73 74 72 65 61 6d 2d 72 65 66 20  ert (stream-ref 
3960: 73 74 72 6d 31 32 33 20 35 29 20 22 73 74 72 65  strm123 5) "stre
3970: 61 6d 2d 72 65 66 3a 20 62 65 79 6f 6e 64 20 65  am-ref: beyond e
3980: 6e 64 20 6f 66 20 73 74 72 65 61 6d 22 29 0d 0a  nd of stream")..
3990: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
39a0: 6d 2d 72 65 66 20 73 74 72 6d 31 32 33 20 30 29  m-ref strm123 0)
39b0: 20 31 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28   1)..  (assert (
39c0: 73 74 72 65 61 6d 2d 72 65 66 20 73 74 72 6d 31  stream-ref strm1
39d0: 32 33 20 31 29 20 32 29 0d 0a 20 20 28 61 73 73  23 1) 2)..  (ass
39e0: 65 72 74 20 28 73 74 72 65 61 6d 2d 72 65 66 20  ert (stream-ref 
39f0: 73 74 72 6d 31 32 33 20 32 29 20 33 29 0d 0a 20  strm123 2) 3).. 
3a00: 20 0d 0a 20 20 3b 20 73 74 72 65 61 6d 2d 72 65   ..  ; stream-re
3a10: 76 65 72 73 65 0d 0a 20 20 28 61 73 73 65 72 74  verse..  (assert
3a20: 20 28 73 74 72 65 61 6d 2d 72 65 76 65 72 73 65   (stream-reverse
3a30: 20 27 28 29 29 20 22 73 74 72 65 61 6d 2d 72 65   '()) "stream-re
3a40: 76 65 72 73 65 3a 20 6e 6f 6e 2d 73 74 72 65 61  verse: non-strea
3a50: 6d 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20  m argument")..  
3a60: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
3a70: 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d 72 65  >list (stream-re
3a80: 76 65 72 73 65 20 28 73 74 72 65 61 6d 29 29 29  verse (stream)))
3a90: 20 27 28 29 29 0d 0a 20 20 28 61 73 73 65 72 74   '())..  (assert
3aa0: 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28   (stream->list (
3ab0: 73 74 72 65 61 6d 2d 72 65 76 65 72 73 65 20 73  stream-reverse s
3ac0: 74 72 6d 31 32 33 29 29 20 27 28 33 20 32 20 31  trm123)) '(3 2 1
3ad0: 29 29 0d 0a 20 20 0d 0a 20 20 3b 20 73 74 72 65  ))..  ..  ; stre
3ae0: 61 6d 2d 73 63 61 6e 0d 0a 20 20 28 61 73 73 65  am-scan..  (asse
3af0: 72 74 20 28 73 74 72 65 61 6d 2d 73 63 61 6e 20  rt (stream-scan 
3b00: 22 66 6f 75 72 22 20 30 20 73 74 72 6d 31 32 33  "four" 0 strm123
3b10: 29 20 22 73 74 72 65 61 6d 2d 73 63 61 6e 3a 20  ) "stream-scan: 
3b20: 6e 6f 6e 2d 70 72 6f 63 65 64 75 72 61 6c 20 61  non-procedural a
3b30: 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73  rgument")..  (as
3b40: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 73 63 61  sert (stream-sca
3b50: 6e 20 2b 20 30 20 27 28 29 29 20 22 73 74 72 65  n + 0 '()) "stre
3b60: 61 6d 2d 73 63 61 6e 3a 20 6e 6f 6e 2d 73 74 72  am-scan: non-str
3b70: 65 61 6d 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a  eam argument")..
3b80: 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65 61    (assert (strea
3b90: 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d  m->list (stream-
3ba0: 73 63 61 6e 20 2b 20 30 20 73 74 72 6d 31 32 33  scan + 0 strm123
3bb0: 29 29 20 27 28 30 20 31 20 33 20 36 29 29 0d 0a  )) '(0 1 3 6))..
3bc0: 20 20 0d 0a 20 20 3b 20 73 74 72 65 61 6d 2d 74    ..  ; stream-t
3bd0: 61 6b 65 0d 0a 20 20 28 61 73 73 65 72 74 20 28  ake..  (assert (
3be0: 73 74 72 65 61 6d 2d 74 61 6b 65 20 35 20 22 66  stream-take 5 "f
3bf0: 6f 75 72 22 29 20 22 73 74 72 65 61 6d 2d 74 61  our") "stream-ta
3c00: 6b 65 3a 20 6e 6f 6e 2d 73 74 72 65 61 6d 20 61  ke: non-stream a
3c10: 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73  rgument")..  (as
3c20: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 74 61 6b  sert (stream-tak
3c30: 65 20 22 66 6f 75 72 22 20 73 74 72 6d 31 32 33  e "four" strm123
3c40: 29 20 22 73 74 72 65 61 6d 2d 74 61 6b 65 3a 20  ) "stream-take: 
3c50: 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 61 72 67 75  non-integer argu
3c60: 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73 73 65 72  ment")..  (asser
3c70: 74 20 28 73 74 72 65 61 6d 2d 74 61 6b 65 20 2d  t (stream-take -
3c80: 34 20 73 74 72 6d 31 32 33 29 20 22 73 74 72 65  4 strm123) "stre
3c90: 61 6d 2d 74 61 6b 65 3a 20 6e 65 67 61 74 69 76  am-take: negativ
3ca0: 65 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20  e argument")..  
3cb0: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
3cc0: 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d 74 61  >list (stream-ta
3cd0: 6b 65 20 35 20 73 74 72 65 61 6d 2d 6e 75 6c 6c  ke 5 stream-null
3ce0: 29 29 20 27 28 29 29 0d 0a 20 20 28 61 73 73 65  )) '())..  (asse
3cf0: 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74  rt (stream->list
3d00: 20 28 73 74 72 65 61 6d 2d 74 61 6b 65 20 30 20   (stream-take 0 
3d10: 73 74 72 65 61 6d 2d 6e 75 6c 6c 29 29 20 27 28  stream-null)) '(
3d20: 29 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  ))..  (assert (s
3d30: 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72  tream->list (str
3d40: 65 61 6d 2d 74 61 6b 65 20 30 20 73 74 72 6d 31  eam-take 0 strm1
3d50: 32 33 29 29 20 27 28 29 29 0d 0a 20 20 28 61 73  23)) '())..  (as
3d60: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69  sert (stream->li
3d70: 73 74 20 28 73 74 72 65 61 6d 2d 74 61 6b 65 20  st (stream-take 
3d80: 32 20 73 74 72 6d 31 32 33 29 29 20 27 28 31 20  2 strm123)) '(1 
3d90: 32 29 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28  2))..  (assert (
3da0: 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74  stream->list (st
3db0: 72 65 61 6d 2d 74 61 6b 65 20 33 20 73 74 72 6d  ream-take 3 strm
3dc0: 31 32 33 29 29 20 27 28 31 20 32 20 33 29 29 0d  123)) '(1 2 3)).
3dd0: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
3de0: 61 6d 2d 3e 6c 69 73 74 20 28 73 74 72 65 61 6d  am->list (stream
3df0: 2d 74 61 6b 65 20 35 20 73 74 72 6d 31 32 33 29  -take 5 strm123)
3e00: 29 20 27 28 31 20 32 20 33 29 29 0d 0a 20 20 0d  ) '(1 2 3))..  .
3e10: 0a 20 20 3b 20 73 74 72 65 61 6d 2d 74 61 6b 65  .  ; stream-take
3e20: 2d 77 68 69 6c 65 0d 0a 20 20 28 61 73 73 65 72  -while..  (asser
3e30: 74 20 28 73 74 72 65 61 6d 2d 74 61 6b 65 2d 77  t (stream-take-w
3e40: 68 69 6c 65 20 6f 64 64 3f 20 22 66 6f 75 72 22  hile odd? "four"
3e50: 29 20 22 73 74 72 65 61 6d 2d 74 61 6b 65 2d 77  ) "stream-take-w
3e60: 68 69 6c 65 3a 20 6e 6f 6e 2d 73 74 72 65 61 6d  hile: non-stream
3e70: 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28   argument")..  (
3e80: 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 74  assert (stream-t
3e90: 61 6b 65 2d 77 68 69 6c 65 20 22 66 6f 75 72 22  ake-while "four"
3ea0: 20 73 74 72 6d 31 32 33 29 20 22 73 74 72 65 61   strm123) "strea
3eb0: 6d 2d 74 61 6b 65 2d 77 68 69 6c 65 3a 20 6e 6f  m-take-while: no
3ec0: 6e 2d 70 72 6f 63 65 64 75 72 61 6c 20 61 72 67  n-procedural arg
3ed0: 75 6d 65 6e 74 22 29 0d 0a 20 20 28 61 73 73 65  ument")..  (asse
3ee0: 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74  rt (stream->list
3ef0: 20 28 73 74 72 65 61 6d 2d 74 61 6b 65 2d 77 68   (stream-take-wh
3f00: 69 6c 65 20 6f 64 64 3f 20 73 74 72 6d 31 32 33  ile odd? strm123
3f10: 29 29 20 27 28 31 29 29 0d 0a 20 20 28 61 73 73  )) '(1))..  (ass
3f20: 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73  ert (stream->lis
3f30: 74 20 28 73 74 72 65 61 6d 2d 74 61 6b 65 2d 77  t (stream-take-w
3f40: 68 69 6c 65 20 65 76 65 6e 3f 20 73 74 72 6d 31  hile even? strm1
3f50: 32 33 29 29 20 27 28 29 29 0d 0a 20 20 28 61 73  23)) '())..  (as
3f60: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69  sert (stream->li
3f70: 73 74 20 28 73 74 72 65 61 6d 2d 74 61 6b 65 2d  st (stream-take-
3f80: 77 68 69 6c 65 20 70 6f 73 69 74 69 76 65 3f 20  while positive? 
3f90: 73 74 72 6d 31 32 33 29 29 20 27 28 31 20 32 20  strm123)) '(1 2 
3fa0: 33 29 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28  3))..  (assert (
3fb0: 73 74 72 65 61 6d 2d 3e 6c 69 73 74 20 28 73 74  stream->list (st
3fc0: 72 65 61 6d 2d 74 61 6b 65 2d 77 68 69 6c 65 20  ream-take-while 
3fd0: 6e 65 67 61 74 69 76 65 3f 20 73 74 72 6d 31 32  negative? strm12
3fe0: 33 29 29 20 27 28 29 29 0d 0a 20 20 0d 0a 20 20  3)) '())..  ..  
3ff0: 3b 20 73 74 72 65 61 6d 2d 75 6e 66 6f 6c 64 0d  ; stream-unfold.
4000: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
4010: 61 6d 2d 75 6e 66 6f 6c 64 20 22 66 6f 75 72 22  am-unfold "four"
4020: 20 6f 64 64 3f 20 2b 20 30 29 20 22 73 74 72 65   odd? + 0) "stre
4030: 61 6d 2d 75 6e 66 6f 6c 64 3a 20 6e 6f 6e 2d 70  am-unfold: non-p
4040: 72 6f 63 65 64 75 72 61 6c 20 6d 61 70 70 65 72  rocedural mapper
4050: 22 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73  ")..  (assert (s
4060: 74 72 65 61 6d 2d 75 6e 66 6f 6c 64 20 2b 20 22  tream-unfold + "
4070: 66 6f 75 72 22 20 2b 20 30 29 20 22 73 74 72 65  four" + 0) "stre
4080: 61 6d 2d 75 6e 66 6f 6c 64 3a 20 6e 6f 6e 2d 70  am-unfold: non-p
4090: 72 6f 63 65 64 75 72 61 6c 20 70 72 65 64 3f 22  rocedural pred?"
40a0: 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74  )..  (assert (st
40b0: 72 65 61 6d 2d 75 6e 66 6f 6c 64 20 2b 20 6f 64  ream-unfold + od
40c0: 64 3f 20 22 66 6f 75 72 22 20 30 29 20 22 73 74  d? "four" 0) "st
40d0: 72 65 61 6d 2d 75 6e 66 6f 6c 64 3a 20 6e 6f 6e  ream-unfold: non
40e0: 2d 70 72 6f 63 65 64 75 72 61 6c 20 67 65 6e 65  -procedural gene
40f0: 72 61 74 6f 72 22 29 0d 0a 0d 0a 20 20 28 61 73  rator")....  (as
4100: 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69  sert (stream->li
4110: 73 74 20 28 73 74 72 65 61 6d 2d 75 6e 66 6f 6c  st (stream-unfol
4120: 64 20 28 72 73 65 63 20 65 78 70 74 20 32 29 20  d (rsec expt 2) 
4130: 28 72 73 65 63 20 3c 20 31 30 29 20 28 72 73 65  (rsec < 10) (rse
4140: 63 20 2b 20 31 29 20 30 29 29 0d 0a 20 20 20 20  c + 1) 0))..    
4150: 20 20 20 20 20 20 20 27 28 30 20 31 20 34 20 39         '(0 1 4 9
4160: 20 31 36 20 32 35 20 33 36 20 34 39 20 36 34 20   16 25 36 49 64 
4170: 38 31 29 29 0d 0a 20 20 0d 0a 20 20 3b 20 73 74  81))..  ..  ; st
4180: 72 65 61 6d 2d 75 6e 66 6f 6c 64 73 0d 0a 20 20  ream-unfolds..  
4190: 28 61 73 73 65 72 74 0d 0a 20 20 20 20 28 73 74  (assert..    (st
41a0: 72 65 61 6d 2d 3e 6c 69 73 74 0d 0a 20 20 20 20  ream->list..    
41b0: 20 20 28 73 74 72 65 61 6d 2d 75 6e 66 6f 6c 64    (stream-unfold
41c0: 73 0d 0a 20 20 20 20 20 20 20 20 28 6c 61 6d 62  s..        (lamb
41d0: 64 61 20 28 78 29 0d 0a 20 20 20 20 20 20 20 20  da (x)..        
41e0: 20 20 28 6c 65 74 20 28 28 6e 20 28 63 61 72 20    (let ((n (car 
41f0: 78 29 29 20 28 73 20 28 63 64 72 20 78 29 29 29  x)) (s (cdr x)))
4200: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 69  ..            (i
4210: 66 20 28 7a 65 72 6f 3f 20 6e 29 0d 0a 20 20 20  f (zero? n)..   
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 61               (va
4230: 6c 75 65 73 20 27 64 75 6d 6d 79 20 27 28 29 29  lues 'dummy '())
4240: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4250: 20 20 28 76 61 6c 75 65 73 0d 0a 20 20 20 20 20    (values..     
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
4270: 6e 73 20 28 2d 20 6e 20 31 29 20 28 73 74 72 65  ns (- n 1) (stre
4280: 61 6d 2d 63 64 72 20 73 29 29 0d 0a 20 20 20 20  am-cdr s))..    
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
42a0: 69 73 74 20 28 73 74 72 65 61 6d 2d 63 61 72 20  ist (stream-car 
42b0: 73 29 29 29 29 29 29 0d 0a 20 20 20 20 20 20 20  s))))))..       
42c0: 20 28 63 6f 6e 73 20 35 20 28 73 74 72 65 61 6d   (cons 5 (stream
42d0: 2d 66 72 6f 6d 20 30 29 29 29 29 0d 0a 20 20 20  -from 0))))..   
42e0: 20 20 20 27 28 30 20 31 20 32 20 33 20 34 29 29     '(0 1 2 3 4))
42f0: 0d 0a 20 20 0d 0a 20 20 3b 20 73 74 72 65 61 6d  ..  ..  ; stream
4300: 2d 7a 69 70 0d 0a 20 20 28 61 73 73 65 72 74 20  -zip..  (assert 
4310: 28 73 74 72 65 61 6d 2d 7a 69 70 29 20 22 73 74  (stream-zip) "st
4320: 72 65 61 6d 2d 7a 69 70 3a 20 6e 6f 20 73 74 72  ream-zip: no str
4330: 65 61 6d 20 61 72 67 75 6d 65 6e 74 73 22 29 0d  eam arguments").
4340: 0a 20 20 28 61 73 73 65 72 74 20 28 73 74 72 65  .  (assert (stre
4350: 61 6d 2d 7a 69 70 20 22 66 6f 75 72 22 29 20 22  am-zip "four") "
4360: 73 74 72 65 61 6d 2d 7a 69 70 3a 20 6e 6f 6e 2d  stream-zip: non-
4370: 73 74 72 65 61 6d 20 61 72 67 75 6d 65 6e 74 22  stream argument"
4380: 29 0d 0a 20 20 28 61 73 73 65 72 74 20 28 73 74  )..  (assert (st
4390: 72 65 61 6d 2d 7a 69 70 20 73 74 72 6d 31 32 33  ream-zip strm123
43a0: 20 22 66 6f 75 72 22 29 20 22 73 74 72 65 61 6d   "four") "stream
43b0: 2d 7a 69 70 3a 20 6e 6f 6e 2d 73 74 72 65 61 6d  -zip: non-stream
43c0: 20 61 72 67 75 6d 65 6e 74 22 29 0d 0a 20 20 28   argument")..  (
43d0: 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e  assert (stream->
43e0: 6c 69 73 74 20 28 73 74 72 65 61 6d 2d 7a 69 70  list (stream-zip
43f0: 20 73 74 72 6d 31 32 33 20 73 74 72 65 61 6d 2d   strm123 stream-
4400: 6e 75 6c 6c 29 29 20 27 28 29 29 0d 0a 20 20 28  null)) '())..  (
4410: 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e  assert (stream->
4420: 6c 69 73 74 20 28 73 74 72 65 61 6d 2d 7a 69 70  list (stream-zip
4430: 20 73 74 72 6d 31 32 33 29 29 20 27 28 28 31 29   strm123)) '((1)
4440: 20 28 32 29 20 28 33 29 29 29 0d 0a 20 20 28 61   (2) (3)))..  (a
4450: 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c  ssert (stream->l
4460: 69 73 74 20 28 73 74 72 65 61 6d 2d 7a 69 70 20  ist (stream-zip 
4470: 73 74 72 6d 31 32 33 20 73 74 72 6d 31 32 33 29  strm123 strm123)
4480: 29 20 27 28 28 31 20 31 29 20 28 32 20 32 29 20  ) '((1 1) (2 2) 
4490: 28 33 20 33 29 29 29 0d 0a 20 20 28 61 73 73 65  (3 3)))..  (asse
44a0: 72 74 20 28 73 74 72 65 61 6d 2d 3e 6c 69 73 74  rt (stream->list
44b0: 20 28 73 74 72 65 61 6d 2d 7a 69 70 20 73 74 72   (stream-zip str
44c0: 6d 31 32 33 20 28 73 74 72 65 61 6d 2d 66 72 6f  m123 (stream-fro
44d0: 6d 20 31 29 29 29 20 27 28 28 31 20 31 29 20 28  m 1))) '((1 1) (
44e0: 32 20 32 29 20 28 33 20 33 29 29 29 0d 0a 20 20  2 2) (3 3)))..  
44f0: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
4500: 3e 6c 69 73 74 20 28 73 74 72 65 61 6d 2d 7a 69  >list (stream-zi
4510: 70 20 73 74 72 6d 31 32 33 20 73 74 72 6d 31 32  p strm123 strm12
4520: 33 20 73 74 72 6d 31 32 33 29 29 20 27 28 28 31  3 strm123)) '((1
4530: 20 31 20 31 29 20 28 32 20 32 20 32 29 20 28 33   1 1) (2 2 2) (3
4540: 20 33 20 33 29 29 29 0d 0a 20 20 0d 0a 20 20 3b   3 3)))..  ..  ;
4550: 20 6f 74 68 65 72 20 74 65 73 74 73 0d 0a 0d 0a   other tests....
4560: 20 20 28 61 73 73 65 72 74 0d 0a 20 20 20 20 28    (assert..    (
4570: 73 74 72 65 61 6d 2d 63 61 72 0d 0a 20 20 20 20  stream-car..    
4580: 20 20 28 73 74 72 65 61 6d 2d 72 65 76 65 72 73    (stream-revers
4590: 65 0d 0a 20 20 20 20 20 20 20 20 28 73 74 72 65  e..        (stre
45a0: 61 6d 2d 74 61 6b 65 2d 77 68 69 6c 65 0d 0a 20  am-take-while.. 
45b0: 20 20 20 20 20 20 20 20 20 28 72 73 65 63 20 3c           (rsec <
45c0: 20 31 30 30 30 29 0d 0a 20 20 20 20 20 20 20 20   1000)..        
45d0: 20 20 70 72 69 6d 65 73 29 29 29 0d 0a 20 20 20    primes)))..   
45e0: 20 39 39 37 29 0d 0a 20 20 0d 0a 20 20 28 61 73   997)..  ..  (as
45f0: 73 65 72 74 0d 0a 20 20 20 20 28 65 71 75 61 6c  sert..    (equal
4600: 3f 0d 0a 20 20 20 20 20 20 28 73 74 72 65 61 6d  ?..      (stream
4610: 2d 3e 6c 69 73 74 20 28 71 73 6f 72 74 20 3c 20  ->list (qsort < 
4620: 28 73 74 72 65 61 6d 20 33 20 31 20 35 20 32 20  (stream 3 1 5 2 
4630: 34 29 29 29 0d 0a 20 20 20 20 20 20 28 73 74 72  4)))..      (str
4640: 65 61 6d 2d 3e 6c 69 73 74 20 28 69 73 6f 72 74  eam->list (isort
4650: 20 3c 20 28 73 74 72 65 61 6d 20 32 20 35 20 31   < (stream 2 5 1
4660: 20 34 20 33 29 29 29 29 0d 0a 20 20 20 20 23 74   4 3))))..    #t
4670: 29 0d 0a 20 20 20 0d 0a 20 20 28 61 73 73 65 72  )..   ..  (asser
4680: 74 0d 0a 20 20 20 20 28 65 71 75 61 6c 3f 0d 0a  t..    (equal?..
4690: 20 20 20 20 20 20 28 73 74 72 65 61 6d 2d 3e 6c        (stream->l
46a0: 69 73 74 20 28 6d 73 6f 72 74 20 3c 20 28 73 74  ist (msort < (st
46b0: 72 65 61 6d 20 33 20 31 20 35 20 32 20 34 29 29  ream 3 1 5 2 4))
46c0: 29 0d 0a 20 20 20 20 20 20 28 73 74 72 65 61 6d  )..      (stream
46d0: 2d 3e 6c 69 73 74 20 28 69 73 6f 72 74 20 3c 20  ->list (isort < 
46e0: 28 73 74 72 65 61 6d 20 32 20 35 20 31 20 34 20  (stream 2 5 1 4 
46f0: 33 29 29 29 29 0d 0a 20 20 20 20 23 74 29 0d 0a  3))))..    #t)..
4700: 20 20 20 0d 0a 20 20 3b 20 68 74 74 70 3a 2f 2f     ..  ; http://
4710: 77 77 77 2e 72 65 73 65 61 72 63 68 2e 61 74 74  www.research.att
4720: 2e 63 6f 6d 2f 7e 6e 6a 61 73 2f 73 65 71 75 65  .com/~njas/seque
4730: 6e 63 65 73 2f 41 30 35 31 30 33 37 0d 0a 20 20  nces/A051037..  
4740: 28 61 73 73 65 72 74 20 28 73 74 72 65 61 6d 2d  (assert (stream-
4750: 72 65 66 20 68 61 6d 6d 69 6e 67 20 39 39 39 29  ref hamming 999)
4760: 20 35 31 32 30 30 30 30 30 29 0d 0a 20 20 0d 0a   51200000)..  ..
4770: 29 0d 0a 0d 0a 0d 0a 28 75 6e 69 74 2d 74 65 73  )......(unit-tes
4780: 74 29                                            t)