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
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)))) |