The following program creates four infinite lists and tries to take the first of each. Only the last expression raises an error.

#lang racket

(require racket/promise)

(define ones (lazy (cons 1 ones)))
(define ones* (delay (cons 1 ones*)))

(car (force ones))
(car (force ones*))

(define twos (lazy (lazy (cons 2 twos))))
(define twos* (delay (delay (cons 2 twos*))))

(car (force twos))
(car (force twos*))


The fact that compositions of `lazy' are equivalent to one `lazy' makes them easier to use in situations where you want to wrap a value with a promise but don't know whether it's already wrapped. Somehow, this makes it easier to implement lazy languages, but I'm not clear about how.

Neil ⊥

On 04/09/2013 06:05 PM, Lewis Brown wrote:
Thanks, Danny.

I am trying to understand how to use promises, in particular for lazy programming. I know 
there are various implementations that solve this more simply: racket/stream and 
racket/lazy; but I'd like to see how it's done with the more primitive racket/promise 
library. It appears that the "lazy" form is specifically meant for lazy, 
infinite lists, but the spec is not clear enough for me to figure out how to use it. I 
thought a couple examples would make it so.


Lewis Brown
[email protected]
503-583-2332

On 9 Apr 13, at 4:50 PM, Danny Yoo wrote:

Are you sure you're not looking for the racket/stream library instead?
For example:

    #lang racket
    (require racket/stream)
    (define ones (stream-cons 1 ones))


____________________
   Racket Users list:
   http://lists.racket-lang.org/users


____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to