##// 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 * 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 (ps:create)))
152 (setf store (ps:create))
153 (unless (in index (ps:getprop (root vars) name))
153 (setf (ps:getprop (root vars) name) store)))
154 (setf (ps:getprop (root vars) name index)
154 (unless (in index store)
155 (ps:create :num 0 :str "")))
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 ((var-name (api-call var-real-name name)))
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 (api-call var-slot name))))
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 ((var-name (api-call var-real-name name)))
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 (root vars) var-name index
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 type)
183 (defm (root api get-array) (name)
173 (ps:getprop (root vars) (api-call var-real-name name)))
184 (ps:getprop (root vars) name))
174
185
175 (defm (root api kill-var) (name index)
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 (index :whole))
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 assignment
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