<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=utf-8" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.7600.16588"></HEAD>
<BODY>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>Is it a good 
idea to adapt PLT-Scheme implementation of srfi41 to Racket?</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>In 
principle, this is trivial.</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>However, 
when I adapted srfi41 for PLT-Scheme, Eli Barzilay advised me not to double the 
code for promises.</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>I did not 
follow his advice.</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>I now intend 
to follow his advice.</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>This has 
consequences that at first sight may seem undesirable. For example it would no 
longer be possible to distinguish a stream from a plain promise. It is not 
possible to provide a reliable predicate for streams. This also holds for the 
standard implementation. For example:</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>#lang 
racket<BR>(require srfi/41)</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>(define 
improper-stream ((stream-lambda () 1)))<BR>(stream? improper-stream) ; -&gt; 
#t<BR>(stream-null? improper-stream) ; -&gt; error<BR>(stream-pair? 
improper-stream) ; -&gt; error</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>Hence the 
claim that a stream is either stream-null or a stream-pair is not 
fulfilled.</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>The document 
of srfi41 also claims that stream-null is unique. It is not:</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>(define 
another-stream-null (stream-filter number? (stream 'a 'b 's)))<BR>(equal? 
stream-null another-stream-null) ;-&gt; #f, yet:<BR>(stream-null? 
another-stream-null) ; -&gt; #t</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>In the docs 
for a new implementation I would like to make a distinction between abstract 
streams (with abstract&nbsp;predicates but without true (complete) predicates) 
and concrete streams. A concrete stream would be:</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010>concrete-stream ::= null</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010>concrete-stream ::= promise (any promise, and forcing 
may yield anything)</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010>concrete-stream ::= pair whose cdr is a concrete stream 
(and the car probably, but not necessarily&nbsp;a promise)</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>When using 
stream functions on concrete streams that do not satisfy the requirements of 
abstract streams, errors will be reported (just like in th standard 
implementation) I</SPAN></FONT><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010>t is possible to make a predicate for concrete-streams, 
but it seems rather useless to me.</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2 face="Courier New"><SPAN class=181565615-19072010>In srfi41 
attempts have been made to conceal the internally defined syntax stream-lazy. 
Yet stream-lazy can easily be exposed, as in:</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010>(define-syntax my-stream-lazy</SPAN></FONT></DIV>
<DIV><FONT size=2 face="Courier New"><SPAN 
class=181565615-19072010>&nbsp;(syntax-rules ()</SPAN></FONT></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New">&nbsp;&nbsp;((_ expr) ((stream-lambda () 
expr)))))</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New"></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 face="Courier New">While it is 
possible to maintain almost all provided syntaxes and procedures of PLT's 
srfi41, some changes would be noticeable:</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New"></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New">1:</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New">(stream-lambda formals definition ... body 
...1)</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 face="Courier New">can also be 
written as</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 face="Courier New">(lambda 
formals (lazy (let () definition ... body ...)))</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 face="Courier New">To me this 
seems an improvement.</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New"></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New">2:</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 face="Courier New">stream-null 
would just be a synonym for null. There is no reason to wrap it in a 
promise.</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New"></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New">3:</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 face="Courier New">A 
stream-pair could be a promise that yieds a pair, but it could also be a pair 
whose cdr is a promise. There is no reason to wrap a pair of promises in another 
promise.</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New"></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 face="Courier New">Your 
comments/critics/advises are welcome.</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 face="Courier New">Thanks, 
Jos</FONT></SPAN></DIV>
<DIV><SPAN class=181565615-19072010><FONT size=2 
face="Courier New"></FONT></SPAN>&nbsp;</DIV><!-- Converted from text/rtf format -->
<P align=left><FONT size=2><FONT face="Courier New"><SPAN lang=en-gb>Hartelijke 
groet,</SPAN> <BR><SPAN lang=en-gb>Jos Koot</SPAN> <BR><SPAN lang=en-gb>Carrer 
d'Argentona 17 baixos</SPAN> <BR><SPAN lang=en-gb>ES 08302 MATARO</SPAN> 
<BR><SPAN lang=en-gb>España/Spanje /Spain</SPAN> </FONT></FONT></P>
<P><FONT size=2><FONT face="Courier New"><SPAN lang=en-gb>+34937412360</SPAN> 
<BR><SPAN lang=en-gb>+34679944599</SPAN> </FONT></FONT></P>
<P><FONT size=2><FONT face="Courier New"><SPAN lang=en-gb>((((</SPAN><SPAN 
lang=el>λ(x)(((((((x x)x)x)x)x)x)x))</SPAN> <BR><SPAN lang=el>&nbsp;&nbsp; 
(λ(x)(λ(y)(x(x y)))))</SPAN> <BR><SPAN lang=el>&nbsp; (λ(x)(cons'greeting 
x)))</SPAN> <BR><SPAN lang=el>'())</SPAN><SPAN lang=en-gb> ; That's a lot of 
greetings.</SPAN> </FONT></FONT></P>
<DIV><FONT size=2 face=Arial></FONT>&nbsp;</DIV></BODY></HTML>