git.fiddlerwoaroof.com
Browse code

update edn generation a bit to track the number of nodes

Ed Langley authored on 25/07/2018 01:31:04
Showing 1 changed files
... ...
@@ -1,5 +1,10 @@
1 1
 (in-package :edn.generate)
2 2
 
3
+(defun generate-edn-in-range (min-nodes max-nodes)
4
+  (loop for (edn nodes) = (multiple-value-list (generate-edn))
5
+     until (<= min-nodes nodes max-nodes)
6
+     finally (return (values edn nodes))))
7
+
3 8
 (defun generate-edn ()
4 9
   (case (random 3)
5 10
     (0 (generate-map))
... ...
@@ -7,53 +12,59 @@
7 12
     (2 (generate-vect))))
8 13
 
9 14
 (defun generate-nil ()
10
-  "nil")
15
+  (values "nil" 1))
11 16
 
12 17
 (defun prim-generate-char ()
13 18
   (code-char (+ 32 (random #.(- 128 32)))))
14 19
 
15 20
 (defun generate-string ()
16
-  (loop with limit = (random 25)
17
-     repeat limit
18
-     collect (prim-generate-char) into chars
19
-     finally (return (format nil "\"~a\""
20
-                             (serapeum:string-replace-all "\""
21
-                                                          (serapeum:string-replace-all
22
-                                                           "\\"
23
-                                                           (coerce chars 'string)
24
-                                                           "\\\\")
25
-                                                          "\\\"")))))
21
+  (values (loop with limit = (random 25)
22
+             repeat limit
23
+             collect (prim-generate-char) into chars
24
+             finally (return (format nil "\"~a\""
25
+                                     (serapeum:string-replace-all "\""
26
+                                                                  (serapeum:string-replace-all
27
+                                                                   "\\"
28
+                                                                   (coerce chars 'string)
29
+                                                                   "\\\\")
30
+                                                                  "\\\""))))
31
+          1))
26 32
 
27 33
 (defun generate-int ()
28
-  (princ-to-string (- (random 20000)
29
-                      10000)))
34
+  (values (princ-to-string (- (random 20000)
35
+                              10000))
36
+          1))
30 37
 
31 38
 (defun flip-coin ()
32 39
   (= 1 (random 2)))
33 40
 
34 41
 (defun generate-float ()
35
-  (format nil "~[~;-~;+~]~a.~:[~;~:*~a~]~:[~;e~:*~a~]"
36
-          (random 3)
37
-          (if (flip-coin)
38
-              (random 10000)
39
-              0)
40
-          (when (flip-coin)
41
-            (random 10000))
42
-          (when (flip-coin)
43
-            (- (random 100)
44
-               50))))
42
+  (values (format nil "~[~;-~;+~]~a.~:[~;~:*~a~]~:[~;e~:*~a~]~:[~;M~]"
43
+                  (random 3)
44
+                  (if (flip-coin)
45
+                      (random 10000)
46
+                      0)
47
+                  (when (flip-coin)
48
+                    (random 10000))
49
+                  (when (flip-coin)
50
+                    (- (random 100)
51
+                       50))
52
+                  (flip-coin))
53
+          1))
45 54
 
46 55
 (defun generate-character ()
47
-  (format nil "\\~c" (prim-generate-char)))
56
+  (values (format nil "\\~c" (prim-generate-char))
57
+          1))
48 58
 
49 59
 (defun generate-bool ()
50
-  (if (flip-coin)
51
-      "true"
52
-      "false"))
60
+  (values (if (flip-coin)
61
+              "true"
62
+              "false")
63
+          1))
53 64
 
54 65
 (defmacro comment (&body b)
55 66
   (declare (ignore b))
56
-  (values))
67
+  (format nil ";foobar~%"))
57 68
 
58 69
 (comment
59 70
   (or (alpha-char-p x)
... ...
@@ -89,14 +100,16 @@
89 100
      finally (return (coerce chars 'string))))
90 101
 
91 102
 (defun generate-symbol ()
92
-  (let ((ns (generate-name 5))
93
-        (name (generate-name 20)))
94
-    (if (flip-coin)
95
-        name
96
-        (format nil "~a/~a" ns name))))
103
+  (values (let ((ns (generate-name 5))
104
+                (name (generate-name 20)))
105
+            (if (flip-coin)
106
+                name
107
+                (format nil "~a/~a" ns name)))
108
+          1))
97 109
 
98 110
 (defun generate-keyword ()
99
-  (format nil ":~a" (generate-symbol)))
111
+  (values (format nil ":~a" (generate-symbol))
112
+          1))
100 113
 
101 114
 (defun generate-primitive ()
102 115
   (case (random 8)
... ...
@@ -134,34 +147,44 @@
134 147
 
135 148
 (defun generate-map (&optional (key-func 'not-float) (value-func 'compound-or-primitive))
136 149
   (loop
150
+     with nodes = 0
137 151
      with keys = (fset:set)
138 152
      repeat (random 10)
139
-     for key = (loop for next = (funcall key-func)
153
+     for key = (loop for (next key-nodes) = (multiple-value-list (funcall key-func))
140 154
                   until (not (fset:contains? keys next))
155
+                  do (incf nodes key-nodes)
141 156
                   finally
142 157
                     (fset:includef keys next)
143 158
                     (return next))
144
-     for value = (funcall value-func)
159
+     for (value value-nodes) = (multiple-value-list (funcall value-func))
160
+     do (incf nodes value-nodes)
145 161
      collect (format nil "~a ~a" key value) into res
146
-     finally (return (format nil "{~{~{~a~^~[ ~;, ~;,~; ,~]~}~}}"
147
-                             (mapcar (serapeum:op (list _1 (random 3)))
148
-                                     (remove-duplicates res :test 'equal))))))
162
+     finally (return (values (format nil "{~{~{~a~^~[ ~;, ~;,~; ,~]~}~}}"
163
+                                     (mapcar (serapeum:op (list _1 (random 3)))
164
+                                             (remove-duplicates res :test 'equal)))
165
+                             nodes))))
149 166
 
150 167
 
151 168
 (defun generate-set (&optional (value-func 'not-float))
152 169
   (loop
170
+     with nodes = 0
153 171
      repeat (random 19)
154
-     for value = (funcall value-func)
172
+     for (value value-nodes) = (multiple-value-list (funcall value-func))
155 173
      collect value into res
156
-     finally (return (format nil "#{~{~{~a~^~[ ~;, ~;,~; ,~]~}~}}"
157
-                             (mapcar (serapeum:op (list _1 (random 3)))
158
-                                     (remove-duplicates res :test 'equal))))))
174
+     do (incf nodes value-nodes)
175
+     finally (return (values (format nil "#{~{~{~a~^~[ ~;, ~;,~; ,~]~}~}}"
176
+                                     (mapcar (serapeum:op (list _1 (random 3)))
177
+                                             (remove-duplicates res :test 'equal)))
178
+                             nodes))))
159 179
 
160 180
 (defun generate-vect (&optional (value-func 'compound-or-primitive))
161 181
   (loop
182
+     with nodes = 0
162 183
      repeat (random 19)
163
-     for value = (funcall value-func)
184
+     for (value value-nodes) = (multiple-value-list (funcall value-func))
164 185
      collect value into res
165
-     finally (return (format nil "[~{~{~a~^~[ ~;, ~;,~; ,~]~}~}]"
166
-                             (mapcar (serapeum:op (list _1 (random 3)))
167
-                                     res)))))
186
+     do (incf nodes value-nodes)
187
+     finally (return (values (format nil "[~{~{~a~^~[ ~;, ~;,~; ,~]~}~}]"
188
+                                     (mapcar (serapeum:op (list _1 (random 3)))
189
+                                             res))
190
+                             nodes))))