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") "&") | |||
|
99 | (replace (regex "/</g") "<") | |||
|
100 | (replace (regex "/>/g") ">") | |||
|
101 | (replace (regex "/\"/g") """) | |||
|
102 | (replace (regex "/'/g") "'"))) | |||
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 |
'(( |
|
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