# [racket] making Racket code more idiomatic

 From: Joe Gilray (jgilray at gmail.com) Date: Tue Apr 17 12:45:50 EDT 2012 Previous message: [racket] Plot: plot-new-window never happens? Next message: [racket] making Racket code more idiomatic Messages sorted by: [date] [thread] [subject] [author]

```Hi,

To continue our conversation about creating idiomatic Racket code, here is
some code I wrote last night to solve projecteuler.net problem #29:

(define (euler29a)
; calculate 99^2 - duplicates
(- (sqr 99)
(for/sum ([d '(2 3 5 6 7 10)])
(let ([lst '()])
(let loop ([exp 1])
(if (> (expt d exp) 100) (- (length lst) (length
(remove-duplicates lst)))
(begin
(for ([i (in-range 2 101)]) (set! lst (cons (* i
exp) lst)))

It's fast (it avoids calculating a bunch of huge numbers), it gives the
correct answer, so what's not to love?!

Well, it starts off OK, but my eye stumbles over the following:

1) predeclaring lst and accessing it twice, related to each other
2) ugly single parameter named-let loop
3) ugly "begin" - not a big deal, but I just dislike when having to use
begin
4) use of set!

Here is a quick rewrite:

(define (euler29b)
; calculate 99^2 - duplicates
(- (sqr 99)
(for/sum ([d '(2 3 5 6 7 10)])
(let ([lst '()])
((> (expt d exp) 100) (- (length lst) (length
(remove-duplicates lst))))
(for ([i (in-range 2 101)]) (set! lst (cons (* i exp)
lst))))))))

It solves #2 and #3 above, but it is still fundamentally clunky.

Can someone help and teach us all some tricks?  My instincts say it should
be possible to use append-map, for/list and/or foldl to build a list of the
duplicates then simply count them in the for/sum loop, but am still unable
to do it.

Thanks,
-Joe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20120417/01fbc386/attachment.html>
```

 Posted on the users mailing list. Previous message: [racket] Plot: plot-new-window never happens? Next message: [racket] making Racket code more idiomatic Messages sorted by: [date] [thread] [subject] [author]