<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16608" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY>
<DIV><FONT face="Courier New" size=2>Browsing through the documentation of 
sequences,&nbsp;I am overwhelmed by&nbsp;the flexibility.</FONT></DIV>
<DIV><FONT face="Courier New" size=2>I&nbsp;could not refrain from trying out 
some things, of course. Very nice indeed.</FONT></DIV>
<DIV><FONT face="Courier New" size=2>Jos</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New" size=2>(define-sequence-syntax 
ftn-range<BR>&nbsp;(lambda (stx) (raise-syntax-error 'ftn-range "can only be 
used in for clauses" stx))<BR>&nbsp;(lambda (ignore stx)<BR>&nbsp; (let loop 
((stx stx))<BR>&nbsp;&nbsp; (syntax-case stx ()<BR>&nbsp;&nbsp;&nbsp; (((id) 
(ftn-range to))<BR>&nbsp;&nbsp;&nbsp;&nbsp; (loop #'((id) (ftn-range 0 to 
#f))))<BR>&nbsp;&nbsp;&nbsp; (((id) (ftn-range from 
to))<BR>&nbsp;&nbsp;&nbsp;&nbsp; (loop #'((id) (ftn-range from to 
#f))))<BR>&nbsp;&nbsp;&nbsp; (((id) (ftn-range from to step))<BR>&nbsp;&nbsp; 
#'((id)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(:do-in<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (((n f s) ; 
bindings<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (let-values (((f t 
s) (values from to 
step)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (let ((s (or s 
(if (&gt; t f) +1 
-1))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (when 
(zero? s) (error 'ftn-range "zero 
step"))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (values 
(inexact-&gt;exact (ceiling (/ (- t f) s))) f 
s)))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #t ; no 
outer-check<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((k 0)) ; hidden loop 
var<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&lt; k n) 
;&nbsp;pos-guard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (((id) (+ f (* k s)))) 
; users loop var<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #t ; no 
pre-guard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #t ; no 
post-guard<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((add1 
k)))))))))</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>----- Original Message ----- </FONT>
<DIV><FONT face=Arial size=2>From: "Jos Koot" &lt;</FONT><A 
href="mailto:jos.koot@telefonica.net"><FONT face=Arial 
size=2>jos.koot@telefonica.net</FONT></A><FONT face=Arial 
size=2>&gt;</FONT></DIV>
<DIV><FONT face=Arial size=2>To: "Eli Barzilay" &lt;</FONT><A 
href="mailto:eli@barzilay.org"><FONT face=Arial 
size=2>eli@barzilay.org</FONT></A><FONT face=Arial size=2>&gt;</FONT></DIV>
<DIV><FONT face=Arial size=2>Cc: &lt;</FONT><A 
href="mailto:plt-scheme@list.cs.brown.edu"><FONT face=Arial 
size=2>plt-scheme@list.cs.brown.edu</FONT></A><FONT face=Arial 
size=2>&gt;</FONT></DIV>
<DIV><FONT face=Arial size=2>Sent: Saturday, March 01, 2008 4:34 PM</FONT></DIV>
<DIV><FONT face=Arial size=2>Subject: Re: [plt-scheme] for in-range (was 
redefinition in module)</FONT></DIV></DIV>
<DIV><FONT face=Arial><BR><FONT size=2></FONT></FONT></DIV><FONT face=Arial 
size=2>&gt; <BR>&gt; ----- Original Message ----- <BR>&gt; From: "Eli Barzilay" 
&lt;</FONT><A href="mailto:eli@barzilay.org"><FONT face=Arial 
size=2>eli@barzilay.org</FONT></A><FONT face=Arial size=2>&gt;<BR>&gt; To: "Jos 
Koot" &lt;</FONT><A href="mailto:jos.koot@telefonica.net"><FONT face=Arial 
size=2>jos.koot@telefonica.net</FONT></A><FONT face=Arial size=2>&gt;<BR>&gt; 
Cc: "Noel Welsh" &lt;</FONT><A href="mailto:noelwelsh@gmail.com"><FONT 
face=Arial size=2>noelwelsh@gmail.com</FONT></A><FONT face=Arial size=2>&gt;; 
&lt;</FONT><A href="mailto:plt-scheme@list.cs.brown.edu"><FONT face=Arial 
size=2>plt-scheme@list.cs.brown.edu</FONT></A><FONT face=Arial 
size=2>&gt;<BR>&gt; Sent: Saturday, March 01, 2008 3:18 PM<BR>&gt; Subject: Re: 
[plt-scheme] for in-range (was redefinition in module)<BR>&gt; <BR>&gt; 
<BR>&gt;&gt; On Mar&nbsp; 1, Jos Koot wrote:<BR>&gt;&gt;&gt; Hi<BR>&gt;&gt;&gt; 
I had a look in scheme/private/for.ss. If I understand the code<BR>&gt;&gt;&gt; 
correctly in-range computes subsequent values of the variable by<BR>&gt;&gt;&gt; 
accumulated addition of the step to the start. When some decades 
ago<BR>&gt;&gt;&gt; do-loops with real variables were introduced in fortran, 
there was<BR>&gt;&gt;&gt; discussion about how to approach 
it:<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; 1: accumulated addition of the step to the 
start.<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; 2: compute the number of iterations in 
advance as<BR>&gt;&gt;&gt;&nbsp;&nbsp;&nbsp; n=(inexact-&gt;exact (ceiling (/ (- 
finish start) step))))<BR>&gt;&gt;&gt;&nbsp;&nbsp;&nbsp; and loop (for ((var 
(in-range 0 n 1))) (let ((var (+ start (* i <BR>&gt;&gt;&gt; step)))) 
etc))<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; The second method was choosen, because it 
was argued that<BR>&gt;&gt;&gt; accumulative addition also would accumulate 
error. The code below<BR>&gt;&gt;&gt; illustrates the 
difference:<BR>&gt;&gt;<BR>&gt;&gt; This is a *much* smaller problem in Scheme, 
since for the relatively<BR>&gt;&gt; rare cases that you don't want to loop on 
just integers, you can just<BR>&gt;&gt; use exact 
rationals.<BR>&gt;&gt;<BR>&gt;&gt; -- 
<BR>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((lambda (x) 
(x x)) (lambda (x) (x x)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Eli 
Barzilay:<BR>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</FONT><A href="http://www.barzilay.org/"><FONT face=Arial 
size=2>http://www.barzilay.org/</FONT></A><FONT face=Arial 
size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Maze is Life!<BR>&gt; <BR>&gt; A rare case may involve limits that are 
inherently inexact, for example when <BR>&gt; drawn from a 
measurement-device.<BR>&gt; Jos <BR>&gt; <BR>&gt; 
_________________________________________________<BR>&gt;&nbsp; For list-related 
administrative tasks:<BR>&gt;&nbsp; </FONT><A 
href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme"><FONT face=Arial 
size=2>http://list.cs.brown.edu/mailman/listinfo/plt-scheme</FONT></A></BODY></HTML>