##// END OF EJS Templates
Benchmark, bugfixes, code walker
naryl -
r36:ae165d52 default
parent child Browse files
Show More
@@ -0,0 +1,22 b''
1
2 # start
3 i = 0
4 :loop
5 if i < 10000000:
6 i += 1
7 if (i MOD 100000) = 0:
8 *p '.'
9 end
10 jump loop
11 end
12 looptime = MSECSCOUNT
13 *nl 'JUMP: Выполнено за <<looptime>> миллисекунд'
14 *nl
15 for i = 0 to 10000000:
16 if (i MOD 100000) = 0:
17 *p '.'
18 end
19 end
20 fortime = MSECSCOUNT - looptime
21 *nl 'FOR: Выполнено за <<fortime>> миллисекунд'
22 -
@@ -0,0 +1,19 b''
1
2 (in-package code-walker)
3
4 (defvar *transformers* (make-hash-table :test #'equal))
5
6 (defmacro deftransform (transformer-name head args &body body)
7 `(progn
8 (setf (gethash (list ',transformer-name ',head) *transformers*)
9 (lambda ,args ,@body))
10 (list ',transformer-name ',head)))
11
12 (defun walk (transformer-name form)
13 (if (listp form)
14 (let ((transformer (gethash (list transformer-name (first form))
15 *transformers*)))
16 (if transformer
17 (apply transformer (rest form))
18 (mapcar (lambda (subform) (walk transformer-name subform)) form)))
19 form))
@@ -1,4 +1,5 b''
1
1
2 * Optimize variables
2 * CLI build for Linux
3 * CLI build for Linux
3 * CLI build for Windows
4 * CLI build for Windows
4
5
@@ -93,14 +93,18 b''
93 (defun clear-id (id)
93 (defun clear-id (id)
94 (setf (inner-html (by-id id)) ""))
94 (setf (inner-html (by-id id)) ""))
95
95
96 (defvar text-escaper (chain document (create-element :textarea)))
96 (defun escape-html (text)
97 (chain text
98 (replace (regex "/&/g") "&amp;")
99 (replace (regex "/</g") "&lt;")
100 (replace (regex "/>/g") "&gt;")
101 (replace (regex "/\"/g") "&quot;")
102 (replace (regex "/'/g") "&apos;")))
97
103
98 (defun prepare-contents (s &optional force-html)
104 (defun prepare-contents (s &optional force-html)
99 (if (or force-html (get-var "USEHTML" 0 :num))
105 (if (or force-html (get-var "USEHTML" 0 :num))
100 s
106 s
101 (progn
107 (escape-html s)))
102 (setf (@ text-escaper text-content) s)
103 (inner-html text-escaper))))
104
108
105 (defun get-id (id &optional force-html)
109 (defun get-id (id &optional force-html)
106 (inner-html (by-id id)))
110 (inner-html (by-id id)))
@@ -207,7 +211,7 b''
207 ((< i to))
211 ((< i to))
208 ((incf i step))
212 ((incf i step))
209 (set-var name index :num i)
213 (set-var name index :num i)
210 (unless (funcall body)
214 (unless (await (funcall body))
211 (return-from qspfor))))
215 (return-from qspfor))))
212
216
213 ;;; Variable class
217 ;;; Variable class
@@ -79,6 +79,15 b''
79 #:openqst #:addqst #:killqst
79 #:openqst #:addqst #:killqst
80 ))
80 ))
81
81
82 (setf (ps:ps-package-prefix "SUGAR-QSP.MAIN") "qsp_")
83 (setf (ps:ps-package-prefix "SUGAR-QSP.API") "qsp_api_")
84 (setf (ps:ps-package-prefix "SUGAR-QSP.LIB") "qsp_lib_")
85
86 (defpackage :code-walker
87 (:use :cl)
88 (:export #:deftransform
89 #:walk))
90
82 ;;; The compiler
91 ;;; The compiler
83 (defpackage :sugar-qsp
92 (defpackage :sugar-qsp
84 (:use :cl)
93 (:use :cl)
@@ -88,6 +97,3 b''
88 (#:main :sugar-qsp.main))
97 (#:main :sugar-qsp.main))
89 (:export #:parse-file #:entry-point))
98 (:export #:parse-file #:entry-point))
90
99
91 (setf (ps:ps-package-prefix "SUGAR-QSP.MAIN") "qsp_")
92 (setf (ps:ps-package-prefix "SUGAR-QSP.API") "qsp_api_")
93 (setf (ps:ps-package-prefix "SUGAR-QSP.LIB") "qsp_lib_")
@@ -589,11 +589,11 b''
589 ;;; Variables
589 ;;; Variables
590
590
591 (p:defrule variable (and identifier (p:? array-index))
591 (p:defrule variable (and identifier (p:? array-index))
592 (:destructure (id idx)
592 (:destructure (id idx-raw)
593 (let ((idx (case idx
593 (let ((idx (case idx-raw
594 (nil 0)
594 ((nil) 0)
595 (:last nil)
595 (:last nil)
596 (t idx))))
596 (t idx-raw))))
597 (if (char= #\$ (elt (string id) 0))
597 (if (char= #\$ (elt (string id) 0))
598 (list 'lib:qspvar (intern (subseq (string-upcase id) 1) :lib) idx :str)
598 (list 'lib:qspvar (intern (subseq (string-upcase id) 1) :lib) idx :str)
599 (list 'lib:qspvar id idx :num)))))
599 (list 'lib:qspvar id idx :num)))))
@@ -13,7 +13,7 b''
13 (let ((has-labels (some #'keywordp body)))
13 (let ((has-labels (some #'keywordp body)))
14 `(block nil
14 `(block nil
15 ,@(when has-labels
15 ,@(when has-labels
16 '((defvar _labels)))
16 '((var _labels (list))))
17 (tagbody
17 (tagbody
18 ,@body
18 ,@body
19 (void)))))
19 (void)))))
@@ -97,8 +97,7 b''
97 ;;; Yep, that's a huge kludge since Javascript doesn't support arbitrary labels
97 ;;; Yep, that's a huge kludge since Javascript doesn't support arbitrary labels
98
98
99 (defpsmacro jump (target)
99 (defpsmacro jump (target)
100 `(return-from label-body
100 `(return-from label-body ,(string-upcase (second target))))
101 (funcall (getprop _labels ,(string-upcase (second target))))))
102
101
103 (defpsmacro tagbody (&body body)
102 (defpsmacro tagbody (&body body)
104 (let ((funcs (list nil "_nil")))
103 (let ((funcs (list nil "_nil")))
@@ -115,15 +114,23 b''
115 `(progn
114 `(progn
116 ,@body)
115 ,@body)
117 `(progn
116 `(progn
118 (setf ,@(loop :for (label code . rest-labels) :on funcs :by #'cddr
117 (tagbody-blocks ,funcs)
119 :append `((@ _labels ,label)
118 (setf _nextblock :_nil)
120 (block label-body
119 (loop
121 (block ,(intern label)
120 :for _nextblock
122 ,@code
121 := :_nil
123 ,@(when rest-labels
122 :then (await (funcall (getprop _labels _nextblock)))
124 `((funcall
123 :while _nextblock)))))
125 (getprop _labels ,(first rest-labels))))))))))
124
126 (funcall (getprop _labels "_nil"))))))
125 (defpsmacro tagbody-blocks (funcs)
126 `(setf ,@(loop :for (label code . rest-labels) :on funcs :by #'cddr
127 :append `((@ _labels ,label)
128 (async-lambda ()
129 (block label-body
130 ,@code
131 ,@(if rest-labels
132 (list (first rest-labels))
133 nil)))))))
127
134
128 (defpsmacro exit ()
135 (defpsmacro exit ()
129 '(return-from nil (values)))
136 '(return-from nil (values)))
@@ -172,10 +179,10 b''
172 ;;; 22for
179 ;;; 22for
173
180
174 (defpsmacro qspfor (var from to step &body body)
181 (defpsmacro qspfor (var from to step &body body)
175 `((intern "QSPFOR" "API")
182 `(,(intern "QSPFOR" "API")
176 ,(string (second var)) ,(third var) ;; name and index
183 ,(string (second var)) ,(third var) ;; name and index
177 ,from ,to ,step
184 ,from ,to ,step
178 (lambda ()
185 (async-lambda ()
179 (block nil
186 (block nil
180 ,@body
187 ,@body
181 t))))
188 t))))
@@ -8,6 +8,7 b''
8 :pathname "src/"
8 :pathname "src/"
9 :serial t
9 :serial t
10 :components ((:file "package")
10 :components ((:file "package")
11 (:file "walker")
11 (:file "patches")
12 (:file "patches")
12 (:file "js-syms")
13 (:file "js-syms")
13 (:file "main-macros")
14 (:file "main-macros")
General Comments 0
You need to be logged in to leave comments. Login now