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 | 5 | * Windows GUI (for the compiler) |
|
3 | 6 | * Save-load game in slots |
@@ -147,35 +147,49 b'' | |||
|
147 | 147 | name)) |
|
148 | 148 | |
|
149 | 149 | (defm (root api ensure-var) (name index) |
|
150 | (unless (in name (root vars)) | |
|
151 | (setf (ps:getprop (root vars) name) | |
|
152 |
|
|
|
153 |
( |
|
|
154 | (setf (ps:getprop (root vars) name index) | |
|
155 |
|
|
|
150 | (let ((store (api-call var-ref name))) | |
|
151 | (unless store | |
|
152 | (setf store (ps:create)) | |
|
153 | (setf (ps:getprop (root vars) name) store))) | |
|
154 | (unless (in index store) | |
|
155 | (setf (elt store index) (ps:create :num 0 :str ""))) | |
|
156 | 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 | 167 | (defm (root api get-var) (name index) |
|
159 |
(let (( |
|
|
160 | (api-call ensure-var var-name index) | |
|
161 | (ps:getprop (root vars) var-name index | |
|
162 |
|
|
|
168 | (let ((store (var-ref name))) | |
|
169 | (if store | |
|
170 | (if (in index store) | |
|
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 | 175 | (defm (root api set-var) (name index value) |
|
165 |
(let (( |
|
|
176 | (let ((store (var-ref name))) | |
|
166 | 177 | (api-call ensure-var var-name index) |
|
167 |
(setf (ps:getprop |
|
|
178 | (setf (ps:getprop store index | |
|
168 | 179 | (api-call var-slot name)) |
|
169 | 180 | value) |
|
170 | 181 | (values))) |
|
171 | 182 | |
|
172 |
(defm (root api get-array) (name |
|
|
173 |
(ps:getprop (root vars) |
|
|
183 | (defm (root api get-array) (name) | |
|
184 | (ps:getprop (root vars) name)) | |
|
174 | 185 | |
|
175 |
(defm (root api |
|
|
176 | (if (eq index :whole) | |
|
177 | (ps:delete (ps:getprop (root vars) name)) | |
|
178 | (ps:delete (ps:getprop (root vars) name index))) | |
|
186 | (defm (root api set-array) (name value) | |
|
187 | (setf (ps:getprop (root vars) name) value)) | |
|
188 | ||
|
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 | 193 | (values)) |
|
180 | 194 | |
|
181 | 195 | (defm (root api array-size) (name) |
@@ -208,3 +222,20 b'' | |||
|
208 | 222 | :for v := (ps:getprop (root playing) k) |
|
209 | 223 | :do (when (ps:@ v ended) |
|
210 | 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 | 9 | ;;; 2var |
|
10 | 10 | |
|
11 |
(ps:defpsmacro killvar (varname &optional |
|
|
11 | (ps:defpsmacro killvar (varname &optional index) | |
|
12 | 12 | `(api-call kill-var ,varname ,index)) |
|
13 | 13 | |
|
14 | 14 | (ps:defpsmacro killall () |
@@ -141,4 +141,10 b'' | |||
|
141 | 141 | |
|
142 | 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 | 91 | ;;; 8sub |
|
92 | 92 | |
|
93 | 93 | (defm (root lib gosub) (target &rest args) |
|
94 | (conserving-vars (args result) | |
|
94 | (conserving-vars (__funcall args result) | |
|
95 | 95 | (api-call init-args args) |
|
96 | 96 | (funcall (ps:getprop (root locs) target)) |
|
97 | 97 | (values))) |
|
98 | 98 | |
|
99 | 99 | (defm (root lib func) (target &rest args) |
|
100 | (conserving-vars (args result) | |
|
100 | (conserving-vars (__funcall args result) | |
|
101 | 101 | (api-call init-args args) |
|
102 | 102 | (funcall (ps:getprop (root locs) target)) |
|
103 | 103 | (api-call get-result))) |
@@ -107,13 +107,13 b'' | |||
|
107 | 107 | ;;; 10dynamic |
|
108 | 108 | |
|
109 | 109 | (defm (root lib dyneval) (block &rest args) |
|
110 | (conserving-vars (args result) | |
|
110 | (conserving-vars (__funcall args result) | |
|
111 | 111 | (api-call init-args args) |
|
112 | 112 | (funcall block) |
|
113 | 113 | (api-call get-result))) |
|
114 | 114 | |
|
115 | 115 | (defm (root lib dynamic) (&rest args) |
|
116 | (conserving-vars (args result) | |
|
116 | (conserving-vars (__funcall args result) | |
|
117 | 117 | (api-call init-args args) |
|
118 | 118 | (funcall block) |
|
119 | 119 | (values))) |
@@ -211,7 +211,7 b'' | |||
|
211 | 211 | |
|
212 | 212 | (defm (root lib menu) (menu-name) |
|
213 | 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 | 215 | :do (cond ((string= item "") |
|
216 | 216 | (break)) |
|
217 | 217 | ((string= item "-:-") |
@@ -276,6 +276,8 b'' | |||
|
276 | 276 | |
|
277 | 277 | (defm (root lib settimer) ()) |
|
278 | 278 | |
|
279 | ;;; 21local | |
|
280 | ||
|
279 | 281 | ;;; misc |
|
280 | 282 | |
|
281 | 283 | (defm (root lib rgb) ()) |
@@ -13,6 +13,8 b'' | |||
|
13 | 13 | state-stash (ps:create) |
|
14 | 14 | ;; List of audio files being played |
|
15 | 15 | playing (ps:create) |
|
16 | ;; Local variables stack (starts with an empty frame) | |
|
17 | locals (list) | |
|
16 | 18 | ;;; Game data |
|
17 | 19 | ;; ACTions |
|
18 | 20 | acts (ps:create) |
@@ -103,7 +103,7 b'' | |||
|
103 | 103 | ;;; Identifiers |
|
104 | 104 | |
|
105 | 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 | 108 | (defun trim-$ (str) |
|
109 | 109 | (if (char= #\$ (elt str 0)) |
@@ -234,8 +234,8 b'' | |||
|
234 | 234 | |
|
235 | 235 | (p:defrule statement% (and not-a-non-statement |
|
236 | 236 | (or label comment string-output |
|
237 |
block non-returning-intrinsic |
|
|
238 | expression-output)) | |
|
237 | block non-returning-intrinsic local | |
|
238 | assignment expression-output)) | |
|
239 | 239 | (:function second)) |
|
240 | 240 | |
|
241 | 241 | (p:defrule expr-stopper (or comment block non-returning-intrinsic)) |
@@ -258,6 +258,12 b'' | |||
|
258 | 258 | (p:defrule brace-comment (and #\{ (* (not-brace character)) #\}) |
|
259 | 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 | 267 | ;;; Blocks |
|
262 | 268 | |
|
263 | 269 | (p:defrule block (or block-act block-if)) |
@@ -16,19 +16,6 b'' | |||
|
16 | 16 | (ps:defpsmacro in (key obj) |
|
17 | 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 | 19 | ;;; Common |
|
33 | 20 | |
|
34 | 21 | (defmacro defpsintrinsic (name) |
@@ -47,12 +34,16 b'' | |||
|
47 | 34 | `(funcall (root api ,func) ,@args)) |
|
48 | 35 | |
|
49 | 36 | (ps:defpsmacro label-block (&body body) |
|
37 | (let ((has-labels (some #'keywordp body))) | |
|
50 | 38 | `(block nil |
|
51 | ,@(when (some #'keywordp body) | |
|
39 | ,@(when has-labels | |
|
52 | 40 | '((defvar __labels))) |
|
41 | (api-call push-local-frame) | |
|
42 | (unwind-protect | |
|
53 | 43 | (tagbody |
|
54 | 44 | ,@body) |
|
55 | (values))) | |
|
45 | (api-call pop-local-frame)) | |
|
46 | (values)))) | |
|
56 | 47 | |
|
57 | 48 | (ps:defpsmacro str (&rest forms) |
|
58 | 49 | (cond ((zerop (length forms)) |
@@ -186,3 +177,5 b'' | |||
|
186 | 177 | ;;; 19input |
|
187 | 178 | |
|
188 | 179 | ;;; 20time |
|
180 | ||
|
181 | ;;; 21local |
|
1 | NO CONTENT: file was removed, binary diff hidden |
|
1 | NO CONTENT: file was removed, binary diff hidden |
General Comments 0
You need to be logged in to leave comments.
Login now