Thanks, Matthew.
On Sun, Feb 19, 2012 at 11:50, Matthew Flatt <mfl...@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?
____________________ Racket Users list: http://lists.racket-lang.org/users