<div>I wrote SRFI-40, and am currently working on SRFI-41.&nbsp; No promises when it will be ready, though.&nbsp; It will require the module system of&nbsp;R6RS (also records, error, and case-lambda).&nbsp; If you&#39;re interested in code, I could send you some.&nbsp; The current version of the code has stream comprehensions and also pattern-matching on streams.&nbsp; It also has bugs.&nbsp; Someone earlier in the thread said that SRFI-40 is tricky, and doesn&#39;t always delay what they expected; yes, that happens to me, too.
</div>
<div>&nbsp;</div>
<div>Phil<br><br>&nbsp;</div>
<div><span class="gmail_quote">On 8/3/07, <b class="gmail_sendername">David Einstein</b> &lt;<a href="mailto:deinst@gmail.com">deinst@gmail.com</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">I do not know if you know, but there are a lot of stream utilities in<br>the initial proposal of srfi-40, that were going to be moved to
<br>srfi-41, but I assume that the author lost interest before that<br>happened.<br><br>On 8/3/07, Mark Engelberg &lt;<a href="mailto:mark.engelberg@gmail.com">mark.engelberg@gmail.com</a>&gt; wrote:<br>&gt; On 8/3/07, Matthias Felleisen &lt;
<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt; wrote:<br>&gt; &gt; Mark, why don&#39;t you try two different things:<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp; 1. use the srfis for lazy streams and comprehension to rewrite the
<br>&gt; &gt; solutions<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp; 2. use Lazy Scheme and hack together a comprehension macro.<br>&gt; &gt;<br>&gt;<br>&gt; Actually, I ended up getting satisfactory results by tweaking misc.ss<br>&gt; from the swindle directory.&nbsp;&nbsp;I chose to do this because I find
<br>&gt; swindle&#39;s comprehension syntax to be more comfortable than the srfi<br>&gt; version (probably because of its similarity to math/Haskell).<br>&gt;<br>&gt; Here are the changes I made:<br>&gt;<br>&gt; ;;added for stream support
<br>&gt; (require (lib &quot;40.ss&quot; &quot;srfi&quot;))<br>&gt;<br>&gt; ;;added stream comprehension<br>&gt; (defsubst* (stream-of expr clause ...)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; (collect =&gt; (_ stream-null (stream-cons expr _)) clause ...))
<br>&gt;<br>&gt; ;;added stream case to collect-iterator so streams can be used in generators<br>&gt; (define* (collect-iterator seq)<br>&gt;&nbsp;&nbsp; (define (out-of-range r) (lambda (x) (&lt;= r x)))<br>&gt;&nbsp;&nbsp; (cond<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;[(list? seq) (list seq cdr null? car)]
<br>&gt; ;;&gt;&nbsp;&nbsp; * stream: iterate over the stream&#39;s element;<br>&gt; ;;&gt; This is the new line I added.&nbsp;&nbsp;Everything else is the same.<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;[(stream? seq) (list seq stream-cdr stream-null? stream-car)]<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;[(vector? seq) (list 0 add1 (out-of-range (vector-length seq))
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (i) (vector-ref seq i)))]<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;[(string? seq) (list 0 add1 (out-of-range (string-length seq))<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (i) (string-ref seq i)))]<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;[(integer? seq) (list 0 add1 (out-of-range seq) #f)]
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;[(procedure? seq)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; (function-&gt;iterator seq)]<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;[(hash-table? seq)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; (collect-iterator (lambda (yield)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (hash-table-for-each<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seq (lambda (k v) (yield (cons k v))))))]
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;[else (list seq identity #f #f)]))<br>&gt;<br>&gt; I&#39;m pretty happy with this.&nbsp;&nbsp;The stream srfi library is pretty<br>&gt; minimalist, of course.&nbsp;&nbsp;I had to add a lot of useful functions like<br>&gt; stream-takewhile and more.
<br>&gt;<br>&gt; So yes, it&#39;s cool that Scheme (and in particular, Eli&#39;s code) can be<br>&gt; easily extended in this way.&nbsp;&nbsp;I would have been even happier if I<br>&gt; didn&#39;t need to do it myself :) .<br>&gt;<br>
&gt; --Mark<br>&gt;<br>_________________________________________________<br>For list-related administrative tasks:<br><a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme">http://list.cs.brown.edu/mailman/listinfo/plt-scheme
</a><br></blockquote></div><br>