added documentation for some macros and library functions
[k8-xscheme:k8-xscheme.git] / scm_misc / unsort.scm
1 ; SketchyLISP Example Program
2 ; Copyright (C) 2005,2006,2007 Nils M Holm. All rights reserved.
3 ; See the file LICENSE of the SketchyLISP distribution
4 ; for conditions of use.
5 ;
6 ; ---name---
7 ; unsort
8 ;
9 ; ---purpose---
10 ; Generate some entropy by un-sorting a list of
11 ; natural numbers. The order of the list
12 ; .V a
13 ; is changed in a hard to predict way by extracting
14 ; the
15 ; .V (n mod length[a])'th
16 ; element from
17 ; .V a
18 ; and consing it to
19 ; .V b.
20 ; Each extracted element is removed from
21 ; .V a.
22 ; When
23 ; .V a
24 ; is empty, the result is in
25 ; .V b.
26 ;
27 ; ---args---
28 ; A - list to unsort
29 ; SEED - first element to arrange, where 0<SEED<=length[A]
30 ;
31 ; ---example---
32 ; :l src/iota.scm
33 ; (unsort (iota 1 5) 3) => (3 2 5 1 4)
34
35 (define (unsort a seed)
36   (letrec
37     ; Remove n'th element.
38     ((rem-nth
39        (lambda (a n r)
40          (cond ((zero? n)
41              (if (null? a)
42                  (reverse r)
43                  (append (cdr a) (reverse r))))
44            (else (rem-nth (cdr a) (- n 1)
45                           (cons (car a) r))))))
46      ; Unsort list A of length K
47      ; N = element to extract
48      ; R = intermediate result
49      (_unsort
50        (lambda (a n k r)
51          (cond ((zero? k) (cons (car a) r))
52            (else (_unsort (rem-nth a n '())
53                           (remainder (car a) k)
54                           (- k 1)
55                           (cons (list-ref a n) r)))))))
56     (_unsort a seed (- (length a) 1) '())))
57
58 (format #t "~w\n~w\n" (unsort (1 2 3 4 5) 3)  (3 2 5 1 4))