<br>Thanks for demonstrating the use of continuations - it&#39;s quite cool and I need to grok continuation more.&nbsp; Thanks! <br><br><div class="gmail_quote">On Sun, Mar 2, 2008 at 2:01 AM, Chongkai Zhu &lt;<a href="mailto:[email protected]">[email protected]</a>&gt; wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Or if you don&#39;t want the explicit &quot;break/return&quot; in the macro:<br>
<br>
(define-syntax (while stx)<br>
 &nbsp;(syntax-case stx ()<br>
 &nbsp; &nbsp;((while cond body ...)<br>
 &nbsp; &nbsp; #`(let/ec #,(datum-&gt;syntax-object #&#39;while &#39;return)<br>
<div class="Ih2E3d"> &nbsp; &nbsp; &nbsp; &nbsp; (let lp ()<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (when cond<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; body ...<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (lp)))))))<br>
<br>
<br>
</div> &nbsp;Happy Texas Independence Day!<br>
<font color="#888888"><br>
Chongkai<br>
</font><div><div></div><div class="Wj3C7c"><br>
<br>
<br>
Chongkai Zhu wrote:<br>
&gt; First, you are in a functional programming language. So please stop<br>
&gt; thinking procedurely.<br>
&gt;<br>
&gt; Most people will use first class continuation to implement break control:<br>
&gt;<br>
&gt; (define-syntax while<br>
&gt; &nbsp;(syntax-rules ()<br>
&gt; &nbsp; &nbsp;((_ break cond body ...)<br>
&gt; &nbsp; &nbsp; (let/ec break<br>
&gt; &nbsp; &nbsp; &nbsp; (let lp ()<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; (when cond<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; body ...<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (lp)))))))<br>
&gt;<br>
&gt; (let ((i 0))<br>
&gt; &nbsp;(while return<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; true<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; (display i) (newline)<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; (if (&lt; i 10)<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (set! i (+ i 1))<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (return i))))<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; YC wrote:<br>
&gt;&gt; Hi all -<br>
&gt;&gt;<br>
&gt;&gt; what&#39;s the way to implement a return (or break) control from a<br>
&gt;&gt; infinite while loop (i.e. (while true ...))?<br>
&gt;&gt;<br>
&gt;&gt; A while loop with a test condition is straight forward, but I cannot<br>
&gt;&gt; figure out how to return from an infinite loop. My thought is to<br>
&gt;&gt; introduce a hidden conditional, and then having the inner return<br>
&gt;&gt; macro to set the condition to be true, but having the two macros<br>
&gt;&gt; being separate basically means the return macro&#39;s hidden variable is<br>
&gt;&gt; different from the hidden variable in while loop, so obviously my<br>
&gt;&gt; approach is incorrect.<br>
&gt;&gt;<br>
&gt;&gt; Below is what I have. &nbsp;Thanks in advance for suggestions,<br>
&gt;&gt; yc<br>
&gt;&gt;<br>
&gt;&gt; (define-syntax (return stx)<br>
&gt;&gt; &nbsp; (syntax-case stx ()<br>
&gt;&gt; &nbsp; &nbsp; ((_ exp)<br>
&gt;&gt; &nbsp; &nbsp; &nbsp;#&#39;(begin<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(set! __ret__ #t)<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exp))))<br>
&gt;&gt;<br>
&gt;&gt; (define-syntax (while stx)<br>
&gt;&gt; &nbsp; (syntax-case stx (true)<br>
&gt;&gt; &nbsp; &nbsp; ((_ test exp ...)<br>
&gt;&gt; &nbsp; &nbsp; &nbsp;#&#39;<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(let loop ((__ret__ #f))<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(cond (test exp ... (loop __ret__)))))<br>
&gt;&gt; &nbsp; &nbsp; ((_ true exp ...) ;;; this is *incorrect*...<br>
&gt;&gt; &nbsp; &nbsp; &nbsp;#&#39;(_ (= __ret__ #f) exp ...))))<br>
&gt;&gt;<br>
&gt;&gt; (let ((i 0))<br>
&gt;&gt; &nbsp; &nbsp; (while true<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(display i) (newline)<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(if (&lt; i 10)<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(set! i (+ i 1))<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(return i))))<br>
&gt;&gt; ;; =&gt; set!: cannot set undefined identifier: __ret__<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; ------------------------------------------------------------------------<br>
&gt;&gt;<br>
&gt;&gt; _________________________________________________<br>
&gt;&gt; &nbsp; For list-related administrative tasks:<br>
&gt;&gt; &nbsp; <a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme" target="_blank">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br>
&gt; _________________________________________________<br>
&gt; &nbsp;For list-related administrative tasks:<br>
&gt; &nbsp;<a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme" target="_blank">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br>
</div></div></blockquote></div><br>