[plt-scheme] while and return macro?

From: YC (yinso.chen at gmail.com)
Date: Sun Mar 2 14:37:23 EST 2008

Thanks for demonstrating the use of continuations - it's quite cool and I
need to grok continuation more.  Thanks!

On Sun, Mar 2, 2008 at 2:01 AM, Chongkai Zhu <czhu at cs.utah.edu> wrote:

> Or if you don't want the explicit "break/return" in the macro:
>
> (define-syntax (while stx)
>  (syntax-case stx ()
>    ((while cond body ...)
>     #`(let/ec #,(datum->syntax-object #'while 'return)
>          (let lp ()
>           (when cond
>             body ...
>             (lp)))))))
>
>
>   Happy Texas Independence Day!
>
> Chongkai
>
>
>
> Chongkai Zhu wrote:
> > First, you are in a functional programming language. So please stop
> > thinking procedurely.
> >
> > Most people will use first class continuation to implement break
> control:
> >
> > (define-syntax while
> >  (syntax-rules ()
> >    ((_ break cond body ...)
> >     (let/ec break
> >       (let lp ()
> >         (when cond
> >           body ...
> >           (lp)))))))
> >
> > (let ((i 0))
> >  (while return
> >         true
> >         (display i) (newline)
> >         (if (< i 10)
> >             (set! i (+ i 1))
> >             (return i))))
> >
> >
> >
> >
> > YC wrote:
> >> Hi all -
> >>
> >> what's the way to implement a return (or break) control from a
> >> infinite while loop (i.e. (while true ...))?
> >>
> >> A while loop with a test condition is straight forward, but I cannot
> >> figure out how to return from an infinite loop. My thought is to
> >> introduce a hidden conditional, and then having the inner return
> >> macro to set the condition to be true, but having the two macros
> >> being separate basically means the return macro's hidden variable is
> >> different from the hidden variable in while loop, so obviously my
> >> approach is incorrect.
> >>
> >> Below is what I have.  Thanks in advance for suggestions,
> >> yc
> >>
> >> (define-syntax (return stx)
> >>   (syntax-case stx ()
> >>     ((_ exp)
> >>      #'(begin
> >>          (set! __ret__ #t)
> >>          exp))))
> >>
> >> (define-syntax (while stx)
> >>   (syntax-case stx (true)
> >>     ((_ test exp ...)
> >>      #'
> >>          (let loop ((__ret__ #f))
> >>          (cond (test exp ... (loop __ret__)))))
> >>     ((_ true exp ...) ;;; this is *incorrect*...
> >>      #'(_ (= __ret__ #f) exp ...))))
> >>
> >> (let ((i 0))
> >>     (while true
> >>            (display i) (newline)
> >>            (if (< i 10)
> >>                (set! i (+ i 1))
> >>                (return i))))
> >> ;; => set!: cannot set undefined identifier: __ret__
> >>
> >>
> >>
> >>
> >>
> ------------------------------------------------------------------------
> >>
> >> _________________________________________________
> >>   For list-related administrative tasks:
> >>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> > _________________________________________________
> >  For list-related administrative tasks:
> >  http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20080302/1ee2be06/attachment.html>

Posted on the users mailing list.