File: for-each.rkt

package info (click to toggle)
racket 7.2%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 125,432 kB
  • sloc: ansic: 258,980; pascal: 59,975; sh: 33,650; asm: 13,558; lisp: 7,124; makefile: 3,329; cpp: 2,889; exp: 499; python: 274; xml: 11
file content (144 lines) | stat: -rw-r--r-- 6,781 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#lang typed/racket/base

(require racket/performance-hint
         "../unsafe.rkt"
         "utils.rkt")

(provide (all-defined-out))

(define-syntax-rule (for-each-array+data-index ds-expr f-expr)
  (let*: ([ds : Indexes  ds-expr]
          [dims : Index  (vector-length ds)])
    (define-syntax-rule (f js j)
      ((ann f-expr (Indexes Nonnegative-Fixnum -> Void)) js j))
    (cond
      [(= dims 0)  (f ds 0)]
      [else
       (define: js : Indexes (make-vector dims 0))
       (case dims
         [(1)  (define: d0 : Index (unsafe-vector-ref ds 0))
               (let: j0-loop : Void ([j0 : Nonnegative-Fixnum  0])
                 (when (j0 . < . d0)
                   (unsafe-vector-set! js 0 j0)
                   (f js j0)
                   (j0-loop (+ j0 1))))]
         [(2)  (define: d0 : Index (unsafe-vector-ref ds 0))
               (define: d1 : Index (unsafe-vector-ref ds 1))
               (let: j0-loop : Void ([j0 : Nonnegative-Fixnum  0]
                                     [j : Nonnegative-Fixnum  0])
                 (when (j0 . < . d0)
                   (unsafe-vector-set! js 0 j0)
                   (let: j1-loop : Void ([j1 : Nonnegative-Fixnum  0]
                                         [j : Nonnegative-Fixnum  j])
                     (cond [(j1 . < . d1)
                            (unsafe-vector-set! js 1 j1)
                            (f js j)
                            (j1-loop (+ j1 1) (unsafe-fx+ j 1))]
                           [else
                            (j0-loop (+ j0 1) j)]))))]
         [else  (let: i-loop : Nonnegative-Fixnum ([i : Nonnegative-Fixnum  0]
                                                   [j : Nonnegative-Fixnum  0])
                  (cond [(i . < . dims)
                         (define: di : Index (unsafe-vector-ref ds i))
                         (let: ji-loop : Nonnegative-Fixnum ([ji : Nonnegative-Fixnum  0]
                                                             [j : Nonnegative-Fixnum  j])
                           (cond [(ji . < . di)
                                  (unsafe-vector-set! js i ji)
                                  (ji-loop (+ ji 1) (i-loop (+ i 1) j))]
                                 [else  j]))]
                        [else  (f js j)
                               (unsafe-fx+ j 1)]))
                (void)])])))

(define-syntax-rule (for-each-array-index ds-expr f-expr)
  (let*: ([ds : Indexes  ds-expr]
          [dims : Index  (vector-length ds)])
    (define-syntax-rule (f js)
      ((ann f-expr (Indexes -> Void)) js))
    (cond
      [(= dims 0)  (f ds)]
      [else
       (define: js : Indexes (make-vector dims 0))
       (case dims
         [(1)  (define: d0 : Index (unsafe-vector-ref ds 0))
               (let: j0-loop : Void ([j0 : Nonnegative-Fixnum  0])
                 (when (j0 . < . d0)
                   (unsafe-vector-set! js 0 j0)
                   (f js)
                   (j0-loop (+ j0 1))))]
         [(2)  (define: d0 : Index (unsafe-vector-ref ds 0))
               (define: d1 : Index (unsafe-vector-ref ds 1))
               (let: j0-loop : Void ([j0 : Nonnegative-Fixnum  0])
                 (when (j0 . < . d0)
                   (unsafe-vector-set! js 0 j0)
                   (let: j1-loop : Void ([j1 : Nonnegative-Fixnum  0])
                     (cond [(j1 . < . d1)
                            (unsafe-vector-set! js 1 j1)
                            (f js)
                            (j1-loop (+ j1 1))]
                           [else
                            (j0-loop (+ j0 1))]))))]
         [else  (let: i-loop : Void ([i : Nonnegative-Fixnum  0])
                  (cond [(i . < . dims)
                         (define: di : Index (unsafe-vector-ref ds i))
                         (let: ji-loop : Void ([ji : Nonnegative-Fixnum  0])
                           (when (ji . < . di)
                             (unsafe-vector-set! js i ji)
                             (i-loop (+ i 1))
                             (ji-loop (+ ji 1))))]
                        [else  (f js)]))])])))

(define-syntax-rule (for-each-data-index ds-expr f-expr)
  (let*: ([ds : Indexes  ds-expr]
          [dims : Index  (vector-length ds)])
    (define-syntax-rule (f j)
      ((ann f-expr (Nonnegative-Fixnum -> Void)) j))
    (cond
      [(= dims 0)  (f 0)]
      [else
       (case dims
         [(1)  (define: d0 : Index (unsafe-vector-ref ds 0))
               (let: j0-loop : Void ([j0 : Nonnegative-Fixnum  0])
                 (when (j0 . < . d0)
                   (f j0)
                   (j0-loop (+ j0 1))))]
         [(2)  (define: d0 : Index (unsafe-vector-ref ds 0))
               (define: d1 : Index (unsafe-vector-ref ds 1))
               (let: j0-loop : Void ([j0 : Nonnegative-Fixnum  0]
                                     [j : Nonnegative-Fixnum  0])
                 (when (j0 . < . d0)
                   (let: j1-loop : Void ([j1 : Nonnegative-Fixnum  0]
                                         [j : Nonnegative-Fixnum  j])
                     (cond [(j1 . < . d1)
                            (f j)
                            (j1-loop (+ j1 1) (unsafe-fx+ j 1))]
                           [else
                            (j0-loop (+ j0 1) j)]))))]
         [else  (let: i-loop : Nonnegative-Fixnum ([i : Nonnegative-Fixnum  0]
                                                   [j : Nonnegative-Fixnum  0])
                  (cond [(i . < . dims)
                         (define: di : Index (unsafe-vector-ref ds i))
                         (let: ji-loop : Nonnegative-Fixnum ([ji : Nonnegative-Fixnum  0]
                                                             [j : Nonnegative-Fixnum  j])
                           (cond [(ji . < . di)
                                  (ji-loop (+ ji 1) (i-loop (+ i 1) j))]
                                 [else  j]))]
                        [else  (f j)
                               (unsafe-fx+ j 1)]))
                (void)])])))

(define-syntax-rule (inline-build-array-data ds-expr g-expr A)
  (let*: ([ds : Indexes  ds-expr]
          [dims : Index  (vector-length ds)])
    (define-syntax-rule (g js j)
      ((ann g-expr (Indexes Nonnegative-Fixnum -> A)) js j))
    (define: size : Nonnegative-Fixnum
      (let: loop : Nonnegative-Fixnum ([k : Nonnegative-Fixnum  0] [size : Nonnegative-Fixnum  1])
        (cond [(k . < . dims)  (loop (+ k 1) (unsafe-fx* size (unsafe-vector-ref ds k)))]
              [else  size])))
    (cond [(= size 0)  (ann (vector) (Vectorof A))]
          [else
           (define: js0 : Indexes (make-vector dims 0))
           (define: vs : (Vectorof A) (make-vector size (g js0 0)))
           (for-each-array+data-index ds (λ (js j) (unsafe-vector-set! vs j (g js j))))
           vs])))