[racket] Space safety in lazy
Thanks, Matthew.
On Sun, Feb 19, 2012 at 11:50, Matthew Flatt <mflatt at cs.utah.edu> wrote:
> Oops --- I should have tried that program more carefully.
>
> The problem seems to be with `or'. If I change to `if', then the
> example runs as intended:
>
> (define (has-negative? l)
> (if (negative? (car l))
> #t
> (has-negative? (rest l))))
>
> The `or' from `lazy' effectively adds a `!' around its last argument
> when `or' is applied directly, and it shouldn't do that.
Using `if' instead of `or' works.
But I don't understand when/why the force `!' is introduced or not.
For example, if I add a `set!' above the `if' expression, the program will
run out of memory:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#lang lazy
(define (list-from n)
(cons n (list-from (add1 n))))
(define last-time-ms (current-inexact-milliseconds))
(define (has-negative? l)
(set! last-time-ms (current-inexact-milliseconds))
(if (negative? (car l))
#t
(has-negative? (rest l))))
(has-negative? (list-from 0)) ;; runs out of memory after a while
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
How to reason about the "laziness" of the program?
> (Another
> repair is to get `or' as a value, since the function form treats its
> last argument correctly.)
>
I didn't understand the above. What does it mean to get `or' as a value?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20120219/627d9249/attachment.html>