[racket-dev] 2htdp/image Feature Suggestion

From: Jos Koot (jos.koot at gmail.com)
Date: Mon Jun 23 13:32:26 EDT 2014

In the recommendations of http://docs.racket-lang.org/style/index.html it is
recommended to use (internal or module top-level) define rather than named
let.
I use named let a lot. How would you rewrite the following? For me it is
rather difficult to make the change without loosing track of the scope of
the variables. I also have a rather distinct way of indenting. 

#lang racket

#|
A rearrangement of a list L is a list with the same elements as L,
but possibly in another order.
Proc make-natural->rearrangement takes a list L and returns a proc.
Let N be the number of distinct rearrangements of L.
The returned proc takes an index K less than N and returns the K-th
distinct rearrangement of L. Two rearrangements R0 and R1 are distinct if
(not (andmap EQ? R0 R1)).
EQ? must be an equivalence relation on the elements of L.

E = element
H = head of L
T = tail of L (append H T) = L
K = index
N = nr of distinct rearrangements of L.
|#

(define (make-natural->rearrangement L (EQ? equal?))
 (let ((N (nr-of-rearrangements L EQ?)))
  (lambda (K)
   (let rearrange ((L L) (K K) (N N) (result '()))
    ; Look for the K-th rearrangement of L and put it's elements in result.
    (if (null? L) result
     (let pseudo-rotate ((H L) (T '()) (K K))
      ; Look in subsequent pseudorotations.
      (let ((E (car H)) (H (cdr H)))
       (if (member E T EQ?)
        ; Skip pseudorotation if it's car already was car of a previous one.
        (pseudo-rotate H (cons E T) K)
        (let ((M (/ (* N (count-occurrences E L EQ?)) (length L))))
         ; M is the nr of rearrangements of (append H T)
         ; computed by means of a recurrent relation.
         (if (< K M)
          ; The rearrangement is in this pseudorotation.
          (rearrange (append H T) K M (cons E result))
          ; The rearrangement is not in this pseudorotation.
          ; Look in the following pseudorotation, but decrease K by the
          ; nr of rearrangements of the skipped pseudorotation.
          (pseudo-rotate H (cons E T) (- K M))))))))))))

(define (nr-of-rearrangements L EQ?) ...)
(define (count-occcurrences E L EQ?) ...)

> -----Original Message-----
> From: dev [mailto:dev-bounces at racket-lang.org] On Behalf Of 
> Asumu Takikawa
> Sent: lunes, 23 de junio de 2014 7:35
> To: Kevin Forchione
> Cc: dev at racket-lang.org
> Subject: Re: [racket-dev] 2htdp/image Feature Suggestion
> 
> On 2014-06-22 20:27:21 -0700, Kevin Forchione wrote:
> >    Thanks! Is there any documentation or guide on which 
> *styles* to prefer in
> >    writing Racket code? I find myself scratching my head at 
> times in these
> >    matters!
> 
> In recent Racket distributions and online docs there's now a style
> manual:
> 
>   http://docs.racket-lang.org/style/index.html
> 
> Cheers,
> Asumu
> _________________________
>   Racket Developers list:
>   http://lists.racket-lang.org/dev


Posted on the dev mailing list.