##// END OF EJS Templates
Locals
naryl -
r14:b6bc7c3f default
parent child Browse files
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 (ps:create)))
153 (unless (in index (ps:getprop (root vars) name))
154 (setf (ps:getprop (root vars) name index)
155 (ps:create :num 0 :str "")))
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 ((var-name (api-call var-real-name name)))
160 (api-call ensure-var var-name index)
161 (ps:getprop (root vars) var-name index
162 (api-call var-slot name))))
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 ((var-name (api-call var-real-name name)))
176 (let ((store (var-ref name)))
166 177 (api-call ensure-var var-name index)
167 (setf (ps:getprop (root vars) var-name index
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 type)
173 (ps:getprop (root vars) (api-call var-real-name name)))
183 (defm (root api get-array) (name)
184 (ps:getprop (root vars) name))
174 185
175 (defm (root api kill-var) (name index)
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 (index :whole))
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 assignment
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