[racket] reference #:when clause in for/list?
Hi Mark
Two ideas:
1. add a bit of state with for/list to save a reference to the expensive
computation
2. filter-map keeps the reference more localised
E.g.
#lang racket
(require math/number-theory)
(define (mersenne-primes n)
(let ([c 'dummy])
(for/list ([i n]
#:when (begin
(set! c (sub1 (expt 2 i)))
(prime? c)))
(list i c))))
(define (mersenne-primes-2 n)
(filter-map (λ (i)
(let ([c (sub1 (expt 2 i))])
(and (prime? c)
(list i c))))
(range n)))
(mersenne-primes 128)
(mersenne-primes-2 128)
Dan
On Sun, Aug 17, 2014 at 7:03 PM, Mark Wallace <lotabout at gmail.com> wrote:
> Consider the following pseudocode:
>
> (for/list ([i ...]
> #:when <very complecated expr E>)
> <reference to the above expr E>)
>
> Can I bind that expression E and reference in the body of "for/list"?
>
> If expression E takes lots of time to finish, we would not want to compute
> it again :).
>
> I understand that there are workarounds like first collect all items of
> expression E and then use 'filter' to get interested items. However it
> would be a waste of memory if the number of interested items is small.
>
> So, any ideas?
>
> --
> Best Regards,
> Mark Wallace.
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20140817/5f187d11/attachment.html>