git.fiddlerwoaroof.com
Browse code

chore: various minor changes, perf improvements

Ed Langley authored on 29/10/2020 21:46:49
Showing 2 changed files
... ...
@@ -11,7 +11,7 @@
11 11
                #:smug 
12 12
                :local-time
13 13
                :uuid
14
-               :fwoar.lisputils)
14
+               :fwoar-lisputils)
15 15
   :in-order-to ((test-op (test-op :cl-edn/test)))
16 16
   :components ((:file "package")
17 17
                (:file "edn" :depends-on ("package" "synthesize"))
... ...
@@ -21,14 +21,14 @@
21 21
 (defsystem :cl-edn/fset
22 22
   :depends-on (#:cl-edn
23 23
                #:fset
24
-               #:fwoar.lisputils)
24
+               #:fwoar-lisputils)
25 25
   :components ((:file "fset-synthesize")))
26 26
 
27 27
 (defsystem :cl-edn/fset-lossy
28 28
   :depends-on (#:cl-edn
29 29
                #:cl-edn/fset
30 30
                #:fset
31
-               #:fwoar.lisputils)
31
+               #:fwoar-lisputils)
32 32
   :components ((:file "fset-lossy-synthesize")))
33 33
 
34 34
 (defsystem :cl-edn/test
... ...
@@ -100,28 +100,34 @@
100 100
   (.or (.nil)
101 101
        (.boolean)))
102 102
 
103
+(defun .try (pred next)
104
+  (lambda (input)
105
+    (when (funcall pred input)
106
+      (funcall next input))))
107
+
103 108
 (defun .collections ()
104
-  (.alt (.tag :map (.map-element))
105
-        (.collection :set (.string= "#{") (.char= #\}))
106
-        (.collection :vector (.char= #\[) (.char= #\]))
107
-        (.collection :list (.char= #\() (.char= #\)))))
109
+  (.or (.tag :map (.map-element))
110
+       (.collection :vector (.char= #\[) (.char= #\]))
111
+       (.collection :list (.char= #\() (.char= #\)))
112
+       (.collection :set (.string= "#{") (.char= #\}))))
108 113
 
109 114
 (defun .atoms ()
110
-  (.alt (.number)
111
-        (.symbol)
112
-        (.keyword)
113
-        (.character)
114
-        (.string)))
115
+  (.or (.number)
116
+       (.symbol)))
115 117
 
116 118
 (defun .element ()
117 119
   (.or (.primitive)
118
-       (.alt (.atoms)
119
-             (.collections)
120
-             
121
-             (.tag :tagged
122
-                   (.let* ((tag (.progn (.char= #\#) (.tag-symbol)))
123
-                           (element (.progn (.s) (.element))))
124
-                     (.identity (list tag element)))))))
120
+       (.atoms)
121
+       (.or (.try (.one-of '(#\" #\: #\\))
122
+                  (.or (.string)
123
+                       (.keyword)
124
+                       (.character)))
125
+            (.try (.one-of '(#\{ #\[ #\( #\#))
126
+                  (.or (.collections)
127
+                       (.tag :tagged
128
+                             (.let* ((tag (.progn (.char= #\#) (.tag-symbol)))
129
+                                     (element (.progn (.s) (.element))))
130
+                               (.identity (list tag element)))))))))
125 131
 
126 132
 (defun .nil ()
127 133
   (.and (.string= "nil")
... ...
@@ -323,15 +329,16 @@
323 329
         (.item)))
324 330
 
325 331
 (defun translate-escape (c)
326
-  (ecase c
332
+  (case c
327 333
     ((#\" #\\) c)
328 334
     (#\t #\tab)
329 335
     (#\n #\newline)
330 336
     (#\r #\return)
331 337
     (#\b #\backspace)
332
-    (#\f #.(code-char 12))))
338
+    (#\f #.(code-char 12))
339
+    (t c)))
333 340
 
334
-(defun parse-string-ending-old (s)
341
+(defun parse-string-ending (s)
335 342
   (let ((pos 0)
336 343
         (done nil))
337 344
     (flet ((consume-char ()
... ...
@@ -351,14 +358,17 @@
351 358
             (values nil 0))))))
352 359
 
353 360
 (defun translate-escapes (s)
354
-  (let ((parts (coerce (fwoar.string-utils:split #\\ s) 'list)))
361
+  (let* ((s (serapeum:string-replace-all "\\\\" s "\\"))
362
+         (parts (coerce (fwoar.string-utils:split #\\ s) 'list)))
355 363
     (serapeum:string-join (list* (car parts)
356 364
                                  (mapcan (lambda (part)
357
-                                           (list (translate-escape (elt part 0))
358
-                                                 (subseq part 1)))
365
+                                           (format t "~&~s~%" part)
366
+                                           (unless (equal part "")
367
+                                             (list (translate-escape (elt part 0))
368
+                                                   (subseq part 1))))
359 369
                                          (cdr parts))))))
360 370
 
361
-(defun parse-string-ending (s)
371
+(defun parse-string-ending-old (s)
362 372
   (declare (optimize (speed 3))
363 373
            (type simple-string s))
364 374
   (loop
... ...
@@ -388,7 +398,7 @@
388 398
 
389 399
 (defun .string-ending ()
390 400
   (lambda (input)
391
-    (multiple-value-bind (ending count) (parse-string-ending input)
401
+    (multiple-value-bind (ending count) (parse-string-ending (coerce input 'simple-string))
392 402
       (if (> count 0)
393 403
           (list (cons ending
394 404
                       (subseq input count)))