Basic: implement CALL in basicpp.py and use it.
[jackhill/mal.git] / basic / core.in.bas
CommitLineData
01e8850d 1REM APPLY should really be in types.in.bas but it is here because it
af621e3a
JM
2REM calls DO_TCO_FUNCTION so it will cause syntax errors for steps1-3
3REM if it is in types.in.bas because there are unresolved labels.
01e8850d
JM
4
5REM APPLY(F, AR) -> R
6REM - restores E
7REM - call using GOTO and with return label/address on the stack
af621e3a 8SUB APPLY
01e8850d
JM
9 REM if metadata, get the actual object
10 IF (Z%(F,0)AND31)>=16 THEN F=Z%(F,1)
11
12 IF (Z%(F,0)AND31)=9 THEN GOTO APPLY_FUNCTION
13 IF (Z%(F,0)AND31)=10 THEN GOTO APPLY_MAL_FUNCTION
14 IF (Z%(F,0)AND31)=11 THEN GOTO APPLY_MAL_FUNCTION
15
16 APPLY_FUNCTION:
17 REM regular function
af621e3a 18 IF Z%(F,1)<60 THEN GOSUB DO_FUNCTION:GOTO APPLY_DONE
01e8850d 19 REM for recur functions (apply, map, swap!), use GOTO
af621e3a 20 IF Z%(F,1)>60 THEN CALL DO_TCO_FUNCTION
01e8850d
JM
21 GOTO APPLY_DONE
22
23 APPLY_MAL_FUNCTION:
24 X=X+1:X%(X)=E: REM save the current environment
25
26 REM create new environ using env and params stored in the
27 REM function and bind the params to the apply arguments
28 O=Z%(F+1,1):BI=Z%(F+1,0):EX=AR:GOSUB ENV_NEW_BINDS
29
af621e3a 30 A=Z%(F,1):E=R:CALL EVAL
01e8850d
JM
31
32 AY=E:GOSUB RELEASE: REM release the new environment
33
34 E=X%(X):X=X-1: REM pop/restore the saved environment
35
36 APPLY_DONE:
af621e3a 37END SUB
01e8850d
JM
38
39
40REM DO_TCO_FUNCTION(F, AR)
af621e3a 41SUB DO_TCO_FUNCTION
01e8850d
JM
42 FF=Z%(F,1)
43
44 REM Get argument values
45 R=AR+1:GOSUB DEREF_R:AA=R
46 R=Z%(AR,1)+1:GOSUB DEREF_R:AB=R
47
48 ON FF-60 GOTO DO_APPLY,DO_MAP,DO_SWAP_BANG
49
50 DO_APPLY:
51 F=AA
52 AR=Z%(AR,1)
53 A=AR:GOSUB COUNT:R4=R
54
55 A=Z%(AR+1,1)
56 REM no intermediate args, but not a list, so convert it first
57 IF R4<=1 AND (Z%(A,0)AND31)<>6 THEN T=6:GOSUB FORCE_SEQ_TYPE:GOTO DO_APPLY_2
58 REM no intermediate args, just call APPLY directly
59 IF R4<=1 THEN GOTO DO_APPLY_1
60
61 REM prepend intermediate args to final args element
62 A=AR:B=0:C=R4-1:GOSUB SLICE
63 REM release the terminator of new list (we skip over it)
64 AY=Z%(R6,1):GOSUB RELEASE
65 REM attach end of slice to final args element
66 Z%(R6,1)=Z%(A+1,1)
67 Z%(Z%(A+1,1),0)=Z%(Z%(A+1,1),0)+32
68
69 GOTO DO_APPLY_2
70
71 DO_APPLY_1:
af621e3a 72 AR=A:CALL APPLY
01e8850d 73
af621e3a 74 GOTO DO_TCO_FUNCTION_DONE
01e8850d
JM
75
76 DO_APPLY_2:
77 X=X+1:X%(X)=R: REM push/save new args for release
78
af621e3a 79 AR=R:CALL APPLY
01e8850d
JM
80
81 AY=X%(X):X=X-1:GOSUB RELEASE: REM pop/release new args
af621e3a 82 GOTO DO_TCO_FUNCTION_DONE
01e8850d
JM
83
84 DO_MAP:
85 F=AA
86
87 REM first result list element
88 T=6:L=0:N=0:GOSUB ALLOC
89
90 REM push future return val, prior entry, F and AB
91 X=X+4:X%(X-3)=R:X%(X-2)=0:X%(X-1)=F:X%(X)=AB
92
93 DO_MAP_LOOP:
94 REM set previous to current if not the first element
95 IF X%(X-2)<>0 THEN Z%(X%(X-2),1)=R
96 REM update previous reference to current
97 X%(X-2)=R
98
99 IF Z%(AB,1)=0 THEN GOTO DO_MAP_DONE
100
101 REM create argument list for apply call
102 Z%(3,0)=Z%(3,0)+32
103 REM inc ref cnt of referred argument
104 T=6:L=3:N=Z%(AB+1,1):GOSUB ALLOC
105
106 REM push argument list
107 X=X+1:X%(X)=R
108
af621e3a 109 AR=R:CALL APPLY
01e8850d
JM
110
111 REM pop apply args are release them
112 AY=X%(X):X=X-1:GOSUB RELEASE
113
114 REM set the result value
115 Z%(X%(X-2)+1,1)=R
116
117 REM restore F
118 F=X%(X-1)
119
120 REM update AB to next source element
121 X%(X)=Z%(X%(X),1)
122 AB=X%(X)
123
124 REM allocate next element
125 T=6:L=0:N=0:GOSUB ALLOC
126
127 GOTO DO_MAP_LOOP
128
129 DO_MAP_DONE:
130 REM get return val
131 R=X%(X-3)
132 REM pop everything off stack
133 X=X-4
af621e3a 134 GOTO DO_TCO_FUNCTION_DONE
01e8850d
JM
135
136
137 DO_SWAP_BANG:
138 F=AB
139
140 REM add atom to front of the args list
141 T=6:L=Z%(Z%(AR,1),1):N=Z%(AA,1):GOSUB ALLOC: REM cons
142 AR=R
143
144 REM push args for release after
145 X=X+1:X%(X)=AR
146
147 REM push atom
148 X=X+1:X%(X)=AA
149
af621e3a 150 CALL APPLY
01e8850d
JM
151
152 REM pop atom
153 AA=X%(X):X=X-1
154
155 REM pop and release args
156 AY=X%(X):X=X-1:GOSUB RELEASE
157
158 REM use reset to update the value
159 AB=R:GOSUB DO_RESET_BANG
160
161 REM but decrease ref cnt of return by 1 (not sure why)
162 AY=R:GOSUB RELEASE
163
af621e3a 164 GOTO DO_TCO_FUNCTION_DONE
01e8850d 165
af621e3a
JM
166 DO_TCO_FUNCTION_DONE:
167END SUB
01e8850d 168
241d5d57 169
cc9dbd92 170REM DO_FUNCTION(F, AR)
241d5d57
JM
171DO_FUNCTION:
172 REM Get the function number
cc9dbd92 173 FF=Z%(F,1)
241d5d57
JM
174
175 REM Get argument values
cc9dbd92
JM
176 R=AR+1:GOSUB DEREF_R:AA=R
177 R=Z%(AR,1)+1:GOSUB DEREF_R:AB=R
241d5d57
JM
178
179 REM Switch on the function number
0e508fa5 180 IF FF>59 THEN ER=-1:ER$="unknown function"+STR$(FF):RETURN
01e8850d 181 ON FF/10+1 GOTO DO_1_9,DO_10_19,DO_20_29,DO_30_39,DO_40_49,DO_50_56
a742287e
JM
182
183 DO_1_9:
184 ON FF GOTO DO_EQUAL_Q,DO_THROW,DO_NIL_Q,DO_TRUE_Q,DO_FALSE_Q,DO_STRING_Q,DO_SYMBOL,DO_SYMBOL_Q,DO_KEYWORD
185 DO_10_19:
186 ON FF-9 GOTO DO_KEYWORD_Q,DO_PR_STR,DO_STR,DO_PRN,DO_PRINTLN,DO_READ_STRING,DO_READLINE,DO_SLURP,DO_LT,DO_LTE
187 DO_20_29:
188 ON FF-19 GOTO DO_GT,DO_GTE,DO_ADD,DO_SUB,DO_MULT,DO_DIV,DO_TIME_MS,DO_LIST,DO_LIST_Q,DO_VECTOR
189 DO_30_39:
bbab5c5d 190 ON FF-29 GOTO DO_VECTOR_Q,DO_HASH_MAP,DO_MAP_Q,DO_ASSOC,DO_THROW,DO_GET,DO_CONTAINS,DO_KEYS,DO_VALS,DO_SEQUENTIAL_Q
a742287e 191 DO_40_49:
01e8850d
JM
192 ON FF-39 GOTO DO_CONS,DO_CONCAT,DO_NTH,DO_FIRST,DO_REST,DO_EMPTY_Q,DO_COUNT,DO_THROW,DO_THROW,DO_WITH_META
193 DO_50_56:
194 ON FF-49 GOTO DO_META,DO_ATOM,DO_ATOM_Q,DO_DEREF,DO_RESET_BANG,DO_EVAL,DO_READ_FILE
241d5d57
JM
195
196 DO_EQUAL_Q:
cc9dbd92
JM
197 A=AA:B=AB:GOSUB EQUAL_Q
198 R=R+1
241d5d57 199 RETURN
5e5ca0d4 200 DO_THROW:
cc9dbd92 201 ER=AA
bbab5c5d 202 Z%(ER,0)=Z%(ER,0)+32
cc9dbd92 203 R=0
5e5ca0d4
JM
204 RETURN
205 DO_NIL_Q:
cc9dbd92
JM
206 R=1
207 IF AA=0 THEN R=2
5e5ca0d4
JM
208 RETURN
209 DO_TRUE_Q:
cc9dbd92
JM
210 R=1
211 IF AA=2 THEN R=2
5e5ca0d4
JM
212 RETURN
213 DO_FALSE_Q:
cc9dbd92
JM
214 R=1
215 IF AA=1 THEN R=2
5e5ca0d4
JM
216 RETURN
217 DO_STRING_Q:
cc9dbd92 218 R=1
bbab5c5d
JM
219 IF (Z%(AA,0)AND31)<>4 THEN RETURN
220 IF MID$(S$(Z%(AA,1)),1,1)=CHR$(127) THEN RETURN
221 R=2
5e5ca0d4
JM
222 RETURN
223 DO_SYMBOL:
a742287e 224 T=5:L=Z%(AA,1):GOSUB ALLOC
5e5ca0d4
JM
225 RETURN
226 DO_SYMBOL_Q:
cc9dbd92 227 R=1
bbab5c5d 228 IF (Z%(AA,0)AND31)=5 THEN R=2
5e5ca0d4 229 RETURN
a742287e
JM
230 DO_KEYWORD:
231 A=Z%(AA,1)
232 AS$=S$(A)
233 IF MID$(AS$,1,1)<>CHR$(127) THEN AS$=CHR$(127)+AS$
234 GOSUB STRING_
235 T=4:L=R:GOSUB ALLOC
236 RETURN
237 DO_KEYWORD_Q:
238 R=1
bbab5c5d 239 IF (Z%(AA,0)AND31)<>4 THEN RETURN
a742287e
JM
240 IF MID$(S$(Z%(AA,1)),1,1)<>CHR$(127) THEN RETURN
241 R=2
242 RETURN
241d5d57
JM
243
244 DO_PR_STR:
cc9dbd92 245 AZ=AR:PR=1:SE$=" ":GOSUB PR_STR_SEQ
a742287e 246 AS$=R$:T=4:GOSUB STRING
241d5d57
JM
247 RETURN
248 DO_STR:
cc9dbd92 249 AZ=AR:PR=0:SE$="":GOSUB PR_STR_SEQ
a742287e 250 AS$=R$:T=4:GOSUB STRING
241d5d57
JM
251 RETURN
252 DO_PRN:
cc9dbd92 253 AZ=AR:PR=1:SE$=" ":GOSUB PR_STR_SEQ
241d5d57 254 PRINT R$
cc9dbd92 255 R=0
241d5d57
JM
256 RETURN
257 DO_PRINTLN:
cc9dbd92 258 AZ=AR:PR=0:SE$=" ":GOSUB PR_STR_SEQ
241d5d57 259 PRINT R$
cc9dbd92 260 R=0
241d5d57 261 RETURN
85d70fb7 262 DO_READ_STRING:
cc9dbd92 263 A$=S$(Z%(AA,1))
85d70fb7
JM
264 GOSUB READ_STR
265 RETURN
30a3d828 266 DO_READLINE:
cc9dbd92
JM
267 A$=S$(Z%(AA,1)):GOSUB READLINE
268 IF EOF=1 THEN EOF=0:R=0:RETURN
269 AS$=R$:T=4:GOSUB STRING
30a3d828 270 RETURN
85d70fb7
JM
271 DO_SLURP:
272 R$=""
cc9dbd92
JM
273 REM OPEN 1,8,2,S$(Z%(AA,1))+",SEQ,R"
274 REM OPEN 1,8,2,S$(Z%(AA,1))
275 OPEN 1,8,0,S$(Z%(AA,1))
85d70fb7
JM
276 DO_SLURP_LOOP:
277 A$=""
278 GET#1,A$
279 IF ASC(A$)=10 THEN R$=R$+CHR$(13)
280 IF (ASC(A$)<>10) AND (A$<>"") THEN R$=R$+A$
281 IF (ST AND 64) THEN GOTO DO_SLURP_DONE
cc9dbd92 282 IF (ST AND 255) THEN ER=-1:ER$="File read error "+STR$(ST):RETURN
85d70fb7
JM
283 GOTO DO_SLURP_LOOP
284 DO_SLURP_DONE:
285 CLOSE 1
a742287e 286 AS$=R$:T=4:GOSUB STRING
85d70fb7 287 RETURN
241d5d57
JM
288
289 DO_LT:
cc9dbd92
JM
290 R=1
291 IF Z%(AA,1)<Z%(AB,1) THEN R=2
241d5d57
JM
292 RETURN
293 DO_LTE:
cc9dbd92
JM
294 R=1
295 IF Z%(AA,1)<=Z%(AB,1) THEN R=2
241d5d57
JM
296 RETURN
297 DO_GT:
cc9dbd92
JM
298 R=1
299 IF Z%(AA,1)>Z%(AB,1) THEN R=2
241d5d57
JM
300 RETURN
301 DO_GTE:
cc9dbd92
JM
302 R=1
303 IF Z%(AA,1)>=Z%(AB,1) THEN R=2
241d5d57
JM
304 RETURN
305
306 DO_ADD:
a742287e 307 T=2:L=Z%(AA,1)+Z%(AB,1):GOSUB ALLOC
241d5d57
JM
308 RETURN
309 DO_SUB:
a742287e 310 T=2:L=Z%(AA,1)-Z%(AB,1):GOSUB ALLOC
241d5d57
JM
311 RETURN
312 DO_MULT:
a742287e 313 T=2:L=Z%(AA,1)*Z%(AB,1):GOSUB ALLOC
241d5d57
JM
314 RETURN
315 DO_DIV:
a742287e 316 T=2:L=Z%(AA,1)/Z%(AB,1):GOSUB ALLOC
241d5d57 317 RETURN
60ef223c 318 DO_TIME_MS:
01e8850d 319 T=2:L=INT((TI-BT)*16.667):GOSUB ALLOC
60ef223c 320 RETURN
241d5d57
JM
321
322 DO_LIST:
cc9dbd92 323 R=AR
bbab5c5d 324 Z%(R,0)=Z%(R,0)+32
241d5d57
JM
325 RETURN
326 DO_LIST_Q:
cc9dbd92
JM
327 A=AA:GOSUB LIST_Q
328 R=R+1: REM map to mal false/true
241d5d57 329 RETURN
5e5ca0d4 330 DO_VECTOR:
a742287e 331 A=AR:T=7:GOSUB FORCE_SEQ_TYPE
5e5ca0d4
JM
332 RETURN
333 DO_VECTOR_Q:
cc9dbd92 334 R=1
bbab5c5d 335 IF (Z%(AA,0)AND31)=7 THEN R=2
5e5ca0d4
JM
336 RETURN
337 DO_HASH_MAP:
a742287e 338 A=AR:T=8:GOSUB FORCE_SEQ_TYPE
5e5ca0d4
JM
339 RETURN
340 DO_MAP_Q:
cc9dbd92 341 R=1
bbab5c5d
JM
342 IF (Z%(AA,0)AND31)=8 THEN R=2
343 RETURN
344 DO_ASSOC:
345 H=AA
346 AR=Z%(AR,1)
347 DO_ASSOC_LOOP:
348 R=AR+1:GOSUB DEREF_R:K=R
349 R=Z%(AR,1)+1:GOSUB DEREF_R:V=R
350 Z%(H,0)=Z%(H,0)+32
351 GOSUB ASSOC1:H=R
352 AR=Z%(Z%(AR,1),1)
353 IF AR=0 OR Z%(AR,1)=0 THEN RETURN
354 GOTO DO_ASSOC_LOOP
355 DO_GET:
356 IF AA=0 THEN R=0:RETURN
357 H=AA:K=AB:GOSUB HASHMAP_GET
358 GOSUB DEREF_R
359 Z%(R,0)=Z%(R,0)+32
5e5ca0d4 360 RETURN
bbab5c5d
JM
361 DO_CONTAINS:
362 H=AA:K=AB:GOSUB HASHMAP_CONTAINS
363 R=R+1
364 RETURN
365 DO_KEYS:
366 GOTO DO_KEYS_VALS
367 DO_VALS:
368 AA=Z%(AA,1)
369 DO_KEYS_VALS:
370 REM first result list element
371 T=6:L=0:N=0:GOSUB ALLOC:T2=R
372
373 DO_KEYS_VALS_LOOP:
374 IF AA=0 OR Z%(AA,1)=0 THEN R=T2:RETURN
375
376 REM copy the value
377 T1=Z%(AA+1,1)
378 REM inc ref cnt of referred argument
379 Z%(T1,0)=Z%(T1,0)+32
380 Z%(R+1,1)=T1
381
382 T1=R: REM save previous
383 REM allocate next element
384 T=6:L=0:N=0:GOSUB ALLOC
385 REM point previous element to this one
386 Z%(T1,1)=R
387
388 IF Z%(Z%(AA,1),1)=0 THEN R=T2:RETURN
389
390 AA=Z%(Z%(AA,1),1)
391
392 GOTO DO_KEYS_VALS_LOOP
241d5d57 393
5e5ca0d4 394 DO_SEQUENTIAL_Q:
cc9dbd92 395 R=1
bbab5c5d 396 IF (Z%(AA,0)AND31)=6 OR (Z%(AA,0)AND31)=7 THEN R=2
5e5ca0d4 397 RETURN
85d70fb7 398 DO_CONS:
a742287e 399 T=6:L=AB:N=AA:GOSUB ALLOC
85d70fb7 400 RETURN
9e8f5211
JM
401 DO_CONCAT:
402 REM if empty arguments, return empty list
bbab5c5d 403 IF Z%(AR,1)=0 THEN R=3:Z%(R,0)=Z%(R,0)+32:RETURN
9e8f5211
JM
404
405 REM single argument
cc9dbd92 406 IF Z%(Z%(AR,1),1)<>0 THEN GOTO DO_CONCAT_MULT
a742287e
JM
407 REM force to list type
408 A=AA:T=6:GOSUB FORCE_SEQ_TYPE
9e8f5211
JM
409 RETURN
410
411 REM multiple arguments
412 DO_CONCAT_MULT:
bbab5c5d 413 CZ=X: REM save current stack position
9e8f5211
JM
414 REM push arguments onto the stack
415 DO_CONCAT_STACK:
cc9dbd92 416 R=AR+1:GOSUB DEREF_R
bbab5c5d 417 X=X+1:X%(X)=R: REM push sequence
cc9dbd92
JM
418 AR=Z%(AR,1)
419 IF Z%(AR,1)<>0 THEN GOTO DO_CONCAT_STACK
9e8f5211
JM
420
421 REM pop last argument as our seq to prepend to
bbab5c5d 422 AB=X%(X):X=X-1
9e8f5211 423 REM last arg/seq is not copied so we need to inc ref to it
bbab5c5d 424 Z%(AB,0)=Z%(AB,0)+32
9e8f5211 425 DO_CONCAT_LOOP:
bbab5c5d
JM
426 IF X=CZ THEN R=AB:RETURN
427 AA=X%(X):X=X-1: REM pop off next seq to prepend
cc9dbd92
JM
428 IF Z%(AA,1)=0 THEN GOTO DO_CONCAT_LOOP: REM skip empty seqs
429 A=AA:B=0:C=-1:GOSUB SLICE
9e8f5211
JM
430
431 REM release the terminator of new list (we skip over it)
cc9dbd92 432 AY=Z%(R6,1):GOSUB RELEASE
9e8f5211
JM
433 REM attach new list element before terminator (last actual
434 REM element to the next sequence
cc9dbd92 435 Z%(R6,1)=AB
9e8f5211 436
cc9dbd92 437 AB=R
9e8f5211 438 GOTO DO_CONCAT_LOOP
60ef223c 439 DO_NTH:
cc9dbd92
JM
440 B=Z%(AB,1)
441 A=AA:GOSUB COUNT
442 IF R<=B THEN R=0:ER=-1:ER$="nth: index out of range":RETURN
70f29a2b 443 DO_NTH_LOOP:
cc9dbd92
JM
444 IF B=0 THEN GOTO DO_NTH_DONE
445 B=B-1
446 AA=Z%(AA,1)
70f29a2b
JM
447 GOTO DO_NTH_LOOP
448 DO_NTH_DONE:
cc9dbd92 449 R=Z%(AA+1,1)
bbab5c5d 450 Z%(R,0)=Z%(R,0)+32
70f29a2b 451 RETURN
85d70fb7 452 DO_FIRST:
a742287e 453 IF AA=0 THEN R=0:RETURN
cc9dbd92
JM
454 IF Z%(AA,1)=0 THEN R=0
455 IF Z%(AA,1)<>0 THEN R=AA+1:GOSUB DEREF_R
bbab5c5d 456 IF R<>0 THEN Z%(R,0)=Z%(R,0)+32
85d70fb7
JM
457 RETURN
458 DO_REST:
bbab5c5d 459 IF AA=0 THEN R=3:Z%(R,0)=Z%(R,0)+32:RETURN
a742287e
JM
460 IF Z%(AA,1)=0 THEN A=AA
461 IF Z%(AA,1)<>0 THEN A=Z%(AA,1)
462 T=6:GOSUB FORCE_SEQ_TYPE
85d70fb7 463 RETURN
241d5d57 464 DO_EMPTY_Q:
cc9dbd92
JM
465 R=1
466 IF Z%(AA,1)=0 THEN R=2
241d5d57
JM
467 RETURN
468 DO_COUNT:
a742287e
JM
469 A=AA:GOSUB COUNT
470 T=2:L=R:GOSUB ALLOC
241d5d57
JM
471 RETURN
472
bbab5c5d
JM
473 DO_WITH_META:
474 T=Z%(AA,0)AND31
475 REM remove existing metadata first
476 IF T>=16 THEN AA=Z%(AA,1):GOTO DO_WITH_META
477 T=T+16:L=AA:N=AB:GOSUB ALLOC
478 RETURN
479 DO_META:
480 IF (Z%(AA,0)AND31)<16 THEN R=0:RETURN
481 R=Z%(AA+1,1)
482 Z%(R,0)=Z%(R,0)+32
483 RETURN
85d70fb7 484 DO_ATOM:
a742287e 485 T=12:L=AA:GOSUB ALLOC
85d70fb7
JM
486 RETURN
487 DO_ATOM_Q:
cc9dbd92 488 R=1
bbab5c5d 489 IF (Z%(AA,0)AND31)=12 THEN R=2
85d70fb7
JM
490 RETURN
491 DO_DEREF:
cc9dbd92 492 R=Z%(AA,1):GOSUB DEREF_R
bbab5c5d 493 Z%(R,0)=Z%(R,0)+32
85d70fb7
JM
494 RETURN
495 DO_RESET_BANG:
cc9dbd92 496 R=AB
85d70fb7 497 REM release current value
cc9dbd92 498 AY=Z%(AA,1):GOSUB RELEASE
85d70fb7 499 REM inc ref by 2 for atom ownership and since we are returning it
bbab5c5d 500 Z%(R,0)=Z%(R,0)+64
85d70fb7 501 REM update value
cc9dbd92 502 Z%(AA,1)=R
85d70fb7 503 RETURN
85d70fb7 504
01e8850d
JM
505 REM DO_PR_MEMORY:
506 REM P1=ZT:P2=-1:GOSUB PR_MEMORY
507 REM RETURN
508 REM DO_PR_MEMORY_SUMMARY:
509 REM GOSUB PR_MEMORY_SUMMARY
510 REM RETURN
241d5d57 511
85d70fb7 512 DO_EVAL:
af621e3a 513 A=AA:E=D:CALL EVAL
85d70fb7
JM
514 RETURN
515
0e508fa5
JM
516 DO_READ_FILE:
517 A$=S$(Z%(AA,1))
518 GOSUB READ_FILE
519 RETURN
520
241d5d57
JM
521INIT_CORE_SET_FUNCTION:
522 GOSUB NATIVE_FUNCTION
cc9dbd92 523 V=R:GOSUB ENV_SET_S
241d5d57
JM
524 RETURN
525
cc9dbd92 526REM INIT_CORE_NS(E)
241d5d57
JM
527INIT_CORE_NS:
528 REM create the environment mapping
529 REM must match DO_FUNCTION mappings
530
cc9dbd92
JM
531 K$="=":A=1:GOSUB INIT_CORE_SET_FUNCTION
532 K$="throw":A=2:GOSUB INIT_CORE_SET_FUNCTION
533 K$="nil?":A=3:GOSUB INIT_CORE_SET_FUNCTION
534 K$="true?":A=4:GOSUB INIT_CORE_SET_FUNCTION
535 K$="false?":A=5:GOSUB INIT_CORE_SET_FUNCTION
536 K$="string?":A=6:GOSUB INIT_CORE_SET_FUNCTION
537 K$="symbol":A=7:GOSUB INIT_CORE_SET_FUNCTION
538 K$="symbol?":A=8:GOSUB INIT_CORE_SET_FUNCTION
a742287e
JM
539 K$="keyword":A=9:GOSUB INIT_CORE_SET_FUNCTION
540 K$="keyword?":A=10:GOSUB INIT_CORE_SET_FUNCTION
cc9dbd92
JM
541
542 K$="pr-str":A=11:GOSUB INIT_CORE_SET_FUNCTION
543 K$="str":A=12:GOSUB INIT_CORE_SET_FUNCTION
544 K$="prn":A=13:GOSUB INIT_CORE_SET_FUNCTION
545 K$="println":A=14:GOSUB INIT_CORE_SET_FUNCTION
546 K$="read-string":A=15:GOSUB INIT_CORE_SET_FUNCTION
547 K$="readline":A=16:GOSUB INIT_CORE_SET_FUNCTION
548 K$="slurp":A=17:GOSUB INIT_CORE_SET_FUNCTION
549
550 K$="<":A=18:GOSUB INIT_CORE_SET_FUNCTION
551 K$="<=":A=19:GOSUB INIT_CORE_SET_FUNCTION
552 K$=">":A=20:GOSUB INIT_CORE_SET_FUNCTION
553 K$=">=":A=21:GOSUB INIT_CORE_SET_FUNCTION
554 K$="+":A=22:GOSUB INIT_CORE_SET_FUNCTION
555 K$="-":A=23:GOSUB INIT_CORE_SET_FUNCTION
556 K$="*":A=24:GOSUB INIT_CORE_SET_FUNCTION
557 K$="/":A=25:GOSUB INIT_CORE_SET_FUNCTION
558 K$="time-ms":A=26:GOSUB INIT_CORE_SET_FUNCTION
559
560 K$="list":A=27:GOSUB INIT_CORE_SET_FUNCTION
561 K$="list?":A=28:GOSUB INIT_CORE_SET_FUNCTION
562 K$="vector":A=29:GOSUB INIT_CORE_SET_FUNCTION
563 K$="vector?":A=30:GOSUB INIT_CORE_SET_FUNCTION
564 K$="hash-map":A=31:GOSUB INIT_CORE_SET_FUNCTION
565 K$="map?":A=32:GOSUB INIT_CORE_SET_FUNCTION
a742287e
JM
566 K$="assoc":A=33:GOSUB INIT_CORE_SET_FUNCTION
567 K$="dissoc":A=34:GOSUB INIT_CORE_SET_FUNCTION
568 K$="get":A=35:GOSUB INIT_CORE_SET_FUNCTION
569 K$="contains?":A=36:GOSUB INIT_CORE_SET_FUNCTION
570 K$="keys":A=37:GOSUB INIT_CORE_SET_FUNCTION
571 K$="vals":A=38:GOSUB INIT_CORE_SET_FUNCTION
cc9dbd92
JM
572
573 K$="sequential?":A=39:GOSUB INIT_CORE_SET_FUNCTION
574 K$="cons":A=40:GOSUB INIT_CORE_SET_FUNCTION
575 K$="concat":A=41:GOSUB INIT_CORE_SET_FUNCTION
576 K$="nth":A=42:GOSUB INIT_CORE_SET_FUNCTION
577 K$="first":A=43:GOSUB INIT_CORE_SET_FUNCTION
578 K$="rest":A=44:GOSUB INIT_CORE_SET_FUNCTION
579 K$="empty?":A=45:GOSUB INIT_CORE_SET_FUNCTION
580 K$="count":A=46:GOSUB INIT_CORE_SET_FUNCTION
cc9dbd92 581
01e8850d
JM
582 REM K$="conj":A=47:GOSUB INIT_CORE_SET_FUNCTION
583 REM K$="seq":A=48:GOSUB INIT_CORE_SET_FUNCTION
584
585 K$="with-meta":A=49:GOSUB INIT_CORE_SET_FUNCTION
586 K$="meta":A=50:GOSUB INIT_CORE_SET_FUNCTION
587 K$="atom":A=51:GOSUB INIT_CORE_SET_FUNCTION
588 K$="atom?":A=52:GOSUB INIT_CORE_SET_FUNCTION
589 K$="deref":A=53:GOSUB INIT_CORE_SET_FUNCTION
590 K$="reset!":A=54:GOSUB INIT_CORE_SET_FUNCTION
cc9dbd92 591
01e8850d
JM
592 K$="eval":A=55:GOSUB INIT_CORE_SET_FUNCTION
593 K$="read-file":A=56:GOSUB INIT_CORE_SET_FUNCTION
241d5d57 594
01e8850d
JM
595 REM these are in DO_TCO_FUNCTION
596 K$="apply":A=61:GOSUB INIT_CORE_SET_FUNCTION
597 K$="map":A=62:GOSUB INIT_CORE_SET_FUNCTION
598 K$="swap!":A=63:GOSUB INIT_CORE_SET_FUNCTION
0e508fa5 599
241d5d57 600 RETURN