Show More
@@ -0,0 +1,8 b'' | |||||
|
1 | ||||
|
2 | # locals | |||
|
3 | ||||
|
4 | var = 1 | |||
|
5 | dynamic { local var = 2 & *pl var } | |||
|
6 | *pl var | |||
|
7 | ||||
|
8 | ----- locals --------------- |
@@ -1,3 +1,6 b'' | |||||
|
1 | ||||
|
2 | * string array keys as addition to number keys | |||
|
3 | * arr[] notation (i.e. with empty index) | |||
1 |
|
4 | |||
2 | * Windows GUI (for the compiler) |
|
5 | * Windows GUI (for the compiler) | |
3 | * Save-load game in slots |
|
6 | * Save-load game in slots |
@@ -147,35 +147,49 b'' | |||||
147 | name)) |
|
147 | name)) | |
148 |
|
148 | |||
149 | (defm (root api ensure-var) (name index) |
|
149 | (defm (root api ensure-var) (name index) | |
150 | (unless (in name (root vars)) |
|
150 | (let ((store (api-call var-ref name))) | |
151 | (setf (ps:getprop (root vars) name) |
|
151 | (unless store | |
152 |
|
|
152 | (setf store (ps:create)) | |
153 |
( |
|
153 | (setf (ps:getprop (root vars) name) store))) | |
154 | (setf (ps:getprop (root vars) name index) |
|
154 | (unless (in index store) | |
155 |
|
|
155 | (setf (elt store index) (ps:create :num 0 :str ""))) | |
156 | (values)) |
|
156 | (values)) | |
157 |
|
157 | |||
|
158 | (defm (root api var-ref) (name) | |||
|
159 | (let ((var-name (api-call var-real-name name)) | |||
|
160 | (local-store (api-call current-local-frame))) | |||
|
161 | (cond ((in var-name local-store) | |||
|
162 | (ps:getprop local-store)) | |||
|
163 | ((in var-name (root vars)) | |||
|
164 | (ps:getprop (root vars) var-name)) | |||
|
165 | (t nil)))) | |||
|
166 | ||||
158 | (defm (root api get-var) (name index) |
|
167 | (defm (root api get-var) (name index) | |
159 |
(let (( |
|
168 | (let ((store (var-ref name))) | |
160 | (api-call ensure-var var-name index) |
|
169 | (if store | |
161 | (ps:getprop (root vars) var-name index |
|
170 | (if (in index store) | |
162 |
|
|
171 | (ps:getprop store index (api-call var-slot name)) | |
|
172 | (report-error (+ "Non-existing index: " name "[" index "]"))) | |||
|
173 | (report-error (+ "Unknown variable: " name))))) | |||
163 |
|
174 | |||
164 | (defm (root api set-var) (name index value) |
|
175 | (defm (root api set-var) (name index value) | |
165 |
(let (( |
|
176 | (let ((store (var-ref name))) | |
166 | (api-call ensure-var var-name index) |
|
177 | (api-call ensure-var var-name index) | |
167 |
(setf (ps:getprop |
|
178 | (setf (ps:getprop store index | |
168 | (api-call var-slot name)) |
|
179 | (api-call var-slot name)) | |
169 | value) |
|
180 | value) | |
170 | (values))) |
|
181 | (values))) | |
171 |
|
182 | |||
172 |
(defm (root api get-array) (name |
|
183 | (defm (root api get-array) (name) | |
173 |
(ps:getprop (root vars) |
|
184 | (ps:getprop (root vars) name)) | |
174 |
|
185 | |||
175 |
(defm (root api |
|
186 | (defm (root api set-array) (name value) | |
176 | (if (eq index :whole) |
|
187 | (setf (ps:getprop (root vars) name) value)) | |
177 | (ps:delete (ps:getprop (root vars) name)) |
|
188 | ||
178 | (ps:delete (ps:getprop (root vars) name index))) |
|
189 | (defm (root api kill-var) (name &optional index) | |
|
190 | (if index | |||
|
191 | (ps:delete (ps:getprop (root vars) name index)) | |||
|
192 | (ps:delete (ps:getprop (root vars) name))) | |||
179 | (values)) |
|
193 | (values)) | |
180 |
|
194 | |||
181 | (defm (root api array-size) (name) |
|
195 | (defm (root api array-size) (name) | |
@@ -208,3 +222,20 b'' | |||||
208 | :for v := (ps:getprop (root playing) k) |
|
222 | :for v := (ps:getprop (root playing) k) | |
209 | :do (when (ps:@ v ended) |
|
223 | :do (when (ps:@ v ended) | |
210 | (ps:delete (ps:@ (root playing) k))))) |
|
224 | (ps:delete (ps:@ (root playing) k))))) | |
|
225 | ||||
|
226 | ;;; Locals | |||
|
227 | ||||
|
228 | (defm (root api push-local-frame) () | |||
|
229 | (ps:chain (root locals) (push (ps:create)))) | |||
|
230 | ||||
|
231 | (defm (root api pop-local-frame) () | |||
|
232 | (ps:chain (root locals) (pop))) | |||
|
233 | ||||
|
234 | (defm (root api current-local-frame) () | |||
|
235 | (elt (root locals) (1- (length (root locals))))) | |||
|
236 | ||||
|
237 | (defm (root api new-local) (name) | |||
|
238 | (let ((frame (api-call current-local-frame)) | |||
|
239 | (var-name (api-call var-real-name name))) | |||
|
240 | (unless (in var-name frame) | |||
|
241 | (setf (ps:getprop frame var-name) (ps:create))))) |
@@ -8,7 +8,7 b'' | |||||
8 |
|
8 | |||
9 | ;;; 2var |
|
9 | ;;; 2var | |
10 |
|
10 | |||
11 |
(ps:defpsmacro killvar (varname &optional |
|
11 | (ps:defpsmacro killvar (varname &optional index) | |
12 | `(api-call kill-var ,varname ,index)) |
|
12 | `(api-call kill-var ,varname ,index)) | |
13 |
|
13 | |||
14 | (ps:defpsmacro killall () |
|
14 | (ps:defpsmacro killall () | |
@@ -141,4 +141,10 b'' | |||||
141 |
|
141 | |||
142 | ;;; 20time |
|
142 | ;;; 20time | |
143 |
|
143 | |||
144 | ;;; misc |
|
144 | ;;; 21local | |
|
145 | ||||
|
146 | (ps:defpsmacro local (var &optional expr) | |||
|
147 | `(progn | |||
|
148 | (api-call new-local ,(string (second var))) | |||
|
149 | ,@(when expr | |||
|
150 | `((set ,var ,expr))))) |
@@ -91,13 +91,13 b'' | |||||
91 | ;;; 8sub |
|
91 | ;;; 8sub | |
92 |
|
92 | |||
93 | (defm (root lib gosub) (target &rest args) |
|
93 | (defm (root lib gosub) (target &rest args) | |
94 | (conserving-vars (args result) |
|
94 | (conserving-vars (__funcall args result) | |
95 | (api-call init-args args) |
|
95 | (api-call init-args args) | |
96 | (funcall (ps:getprop (root locs) target)) |
|
96 | (funcall (ps:getprop (root locs) target)) | |
97 | (values))) |
|
97 | (values))) | |
98 |
|
98 | |||
99 | (defm (root lib func) (target &rest args) |
|
99 | (defm (root lib func) (target &rest args) | |
100 | (conserving-vars (args result) |
|
100 | (conserving-vars (__funcall args result) | |
101 | (api-call init-args args) |
|
101 | (api-call init-args args) | |
102 | (funcall (ps:getprop (root locs) target)) |
|
102 | (funcall (ps:getprop (root locs) target)) | |
103 | (api-call get-result))) |
|
103 | (api-call get-result))) | |
@@ -107,13 +107,13 b'' | |||||
107 | ;;; 10dynamic |
|
107 | ;;; 10dynamic | |
108 |
|
108 | |||
109 | (defm (root lib dyneval) (block &rest args) |
|
109 | (defm (root lib dyneval) (block &rest args) | |
110 | (conserving-vars (args result) |
|
110 | (conserving-vars (__funcall args result) | |
111 | (api-call init-args args) |
|
111 | (api-call init-args args) | |
112 | (funcall block) |
|
112 | (funcall block) | |
113 | (api-call get-result))) |
|
113 | (api-call get-result))) | |
114 |
|
114 | |||
115 | (defm (root lib dynamic) (&rest args) |
|
115 | (defm (root lib dynamic) (&rest args) | |
116 | (conserving-vars (args result) |
|
116 | (conserving-vars (__funcall args result) | |
117 | (api-call init-args args) |
|
117 | (api-call init-args args) | |
118 | (funcall block) |
|
118 | (funcall block) | |
119 | (values))) |
|
119 | (values))) | |
@@ -211,7 +211,7 b'' | |||||
211 |
|
211 | |||
212 | (defm (root lib menu) (menu-name) |
|
212 | (defm (root lib menu) (menu-name) | |
213 | (let ((menu-data (list))) |
|
213 | (let ((menu-data (list))) | |
214 | (loop :for item :in (api-call get-array menu-name) |
|
214 | (loop :for item :in (api-call get-array (api-call var-real-name menu-name)) | |
215 | :do (cond ((string= item "") |
|
215 | :do (cond ((string= item "") | |
216 | (break)) |
|
216 | (break)) | |
217 | ((string= item "-:-") |
|
217 | ((string= item "-:-") | |
@@ -276,6 +276,8 b'' | |||||
276 |
|
276 | |||
277 | (defm (root lib settimer) ()) |
|
277 | (defm (root lib settimer) ()) | |
278 |
|
278 | |||
|
279 | ;;; 21local | |||
|
280 | ||||
279 | ;;; misc |
|
281 | ;;; misc | |
280 |
|
282 | |||
281 | (defm (root lib rgb) ()) |
|
283 | (defm (root lib rgb) ()) |
@@ -13,6 +13,8 b'' | |||||
13 | state-stash (ps:create) |
|
13 | state-stash (ps:create) | |
14 | ;; List of audio files being played |
|
14 | ;; List of audio files being played | |
15 | playing (ps:create) |
|
15 | playing (ps:create) | |
|
16 | ;; Local variables stack (starts with an empty frame) | |||
|
17 | locals (list) | |||
16 | ;;; Game data |
|
18 | ;;; Game data | |
17 | ;; ACTions |
|
19 | ;; ACTions | |
18 | acts (ps:create) |
|
20 | acts (ps:create) |
@@ -103,7 +103,7 b'' | |||||
103 | ;;; Identifiers |
|
103 | ;;; Identifiers | |
104 |
|
104 | |||
105 | ;; From the official docs |
|
105 | ;; From the official docs | |
106 | (defparameter *keywords* '(act addlib addobj addqst and arrcomp arrpos arrsize cla clear *clear close clr *clr cls cmdclear cmdclr copyarr counter countobj curacts curloc debug delact dellib delobj desc disablescroll disablesubex dynamic dyneval else elseif end exit fcolor fname freelib fsize func getobj gosub goto gs gt if iif inclib input instr isnum isplay jump killall killobj killqst killvar lcase lcolor len let loc maintxt max menu mid min mod msecscount msg nl *nl no nosave obj onactsel ongload ongsave onnewloc onobjadd onobjdel onobjsel opengame openqst or p *p pl *pl play qspver rand refint replace rgb rnd savegame selact selobj set settimer showacts showinput showobjs showstat stattxt str strcomp strfind strpos trim ucase unsel unselect usercom user_text usrtxt val view wait xgoto xgt)) |
|
106 | (defparameter *keywords* '(act addlib addobj addqst and arrcomp arrpos arrsize cla clear *clear close clr *clr cls cmdclear cmdclr copyarr counter countobj curacts curloc debug delact dellib delobj desc disablescroll disablesubex dynamic dyneval else elseif end exit fcolor fname freelib fsize func getobj gosub goto gs gt if iif inclib input instr isnum isplay jump killall killobj killqst killvar lcase lcolor len let loc local maintxt max menu mid min mod msecscount msg nl *nl no nosave obj onactsel ongload ongsave onnewloc onobjadd onobjdel onobjsel opengame openqst or p *p pl *pl play qspver rand refint replace rgb rnd savegame selact selobj set settimer showacts showinput showobjs showstat stattxt str strcomp strfind strpos trim ucase unsel unselect usercom user_text usrtxt val view wait xgoto xgt)) | |
107 |
|
107 | |||
108 | (defun trim-$ (str) |
|
108 | (defun trim-$ (str) | |
109 | (if (char= #\$ (elt str 0)) |
|
109 | (if (char= #\$ (elt str 0)) | |
@@ -234,8 +234,8 b'' | |||||
234 |
|
234 | |||
235 | (p:defrule statement% (and not-a-non-statement |
|
235 | (p:defrule statement% (and not-a-non-statement | |
236 | (or label comment string-output |
|
236 | (or label comment string-output | |
237 |
block non-returning-intrinsic |
|
237 | block non-returning-intrinsic local | |
238 | expression-output)) |
|
238 | assignment expression-output)) | |
239 | (:function second)) |
|
239 | (:function second)) | |
240 |
|
240 | |||
241 | (p:defrule expr-stopper (or comment block non-returning-intrinsic)) |
|
241 | (p:defrule expr-stopper (or comment block non-returning-intrinsic)) | |
@@ -258,6 +258,12 b'' | |||||
258 | (p:defrule brace-comment (and #\{ (* (not-brace character)) #\}) |
|
258 | (p:defrule brace-comment (and #\{ (* (not-brace character)) #\}) | |
259 | (:constant nil)) |
|
259 | (:constant nil)) | |
260 |
|
260 | |||
|
261 | (p:defrule local (and (p:~ "local") spaces variable (p:? (and spaces? #\= spaces? expression))) | |||
|
262 | (:lambda (list) | |||
|
263 | (list* 'local (third list) | |||
|
264 | (when (fourth list) | |||
|
265 | (list (fourth (fourth list))))))) | |||
|
266 | ||||
261 | ;;; Blocks |
|
267 | ;;; Blocks | |
262 |
|
268 | |||
263 | (p:defrule block (or block-act block-if)) |
|
269 | (p:defrule block (or block-act block-if)) |
@@ -16,19 +16,6 b'' | |||||
16 | (ps:defpsmacro in (key obj) |
|
16 | (ps:defpsmacro in (key obj) | |
17 | `(ps:chain ,obj (has-own-property ,key))) |
|
17 | `(ps:chain ,obj (has-own-property ,key))) | |
18 |
|
18 | |||
19 | (ps:defpsmacro conserving-vars (vars &body body) |
|
|||
20 | "Calls body with safely stored away VARS (whole arrays, both namespaces), and restores their values after that returning what BODY returns." |
|
|||
21 | `(let ((__conserved (list ,@(loop :for var :in vars |
|
|||
22 | :collect `(root vars ,var))))) |
|
|||
23 | ,@(loop :for var :in vars |
|
|||
24 | :collect `(setf (root vars ,var) (ps:create :num 0 :str ""))) |
|
|||
25 | (unwind-protect |
|
|||
26 | (progn ,@body) |
|
|||
27 | (progn |
|
|||
28 | ,@(loop :for var :in vars |
|
|||
29 | :for i from 0 |
|
|||
30 | :collect `(setf (root vars ,var) (ps:@ __conserved ,i))))))) |
|
|||
31 |
|
||||
32 | ;;; Common |
|
19 | ;;; Common | |
33 |
|
20 | |||
34 | (defmacro defpsintrinsic (name) |
|
21 | (defmacro defpsintrinsic (name) | |
@@ -47,12 +34,16 b'' | |||||
47 | `(funcall (root api ,func) ,@args)) |
|
34 | `(funcall (root api ,func) ,@args)) | |
48 |
|
35 | |||
49 | (ps:defpsmacro label-block (&body body) |
|
36 | (ps:defpsmacro label-block (&body body) | |
50 | `(block nil |
|
37 | (let ((has-labels (some #'keywordp body))) | |
51 | ,@(when (some #'keywordp body) |
|
38 | `(block nil | |
52 | '((defvar __labels))) |
|
39 | ,@(when has-labels | |
53 | (tagbody |
|
40 | '((defvar __labels))) | |
54 | ,@body) |
|
41 | (api-call push-local-frame) | |
55 | (values))) |
|
42 | (unwind-protect | |
|
43 | (tagbody | |||
|
44 | ,@body) | |||
|
45 | (api-call pop-local-frame)) | |||
|
46 | (values)))) | |||
56 |
|
47 | |||
57 | (ps:defpsmacro str (&rest forms) |
|
48 | (ps:defpsmacro str (&rest forms) | |
58 | (cond ((zerop (length forms)) |
|
49 | (cond ((zerop (length forms)) | |
@@ -186,3 +177,5 b'' | |||||
186 | ;;; 19input |
|
177 | ;;; 19input | |
187 |
|
178 | |||
188 | ;;; 20time |
|
179 | ;;; 20time | |
|
180 | ||||
|
181 | ;;; 21local |
1 | NO CONTENT: file was removed, binary diff hidden |
|
NO CONTENT: file was removed, binary diff hidden |
1 | NO CONTENT: file was removed, binary diff hidden |
|
NO CONTENT: file was removed, binary diff hidden |
General Comments 0
You need to be logged in to leave comments.
Login now