[plt-scheme] while and return macro?
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