[racket] how to use 'lazy' from racket/promise

From: Ryan Culpepper (ryanc at ccs.neu.edu)
Date: Tue Apr 9 21:32:12 EDT 2013

See SRFI-45 (http://srfi.schemers.org/srfi-45/srfi-45.html) for a 
discussion of why lazy is necessary (ie, why force and delay are not 
sufficient in practice).

Racket's lazy might (?) be slightly different from the one discussed 
there, though. See this post by Eli for why: 
http://srfi.schemers.org/srfi-45/post-mail-archive/msg00013.html 
(according to comments in racket/private/promise.rkt).

Ryan

On 04/09/2013 09:25 PM, Neil Toronto wrote:
> 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
>> lewisbrown at gmail.com
>> 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



Posted on the users mailing list.