Commit | Line | Data |
---|---|---|
49c172c0 | 1 | REM > env library for mal in BBC BASIC |
dbe45187 | 2 | |
1204264c BH |
3 | DEF FNnew_env(outer%, binds%, exprs%) |
4 | LOCAL env% | |
5 | env% = FNalloc_environment(outer%) | |
6 | WHILE NOT FNis_empty(binds%) | |
f14770fc | 7 | IF FNunbox_symbol(FNfirst(binds%)) = "&" THEN |
b716a56a | 8 | PROCenv_set(env%, FNnth(binds%, 1), FNas_list(exprs%)) |
0e159177 BH |
9 | binds% = FNempty |
10 | ELSE | |
f14770fc BH |
11 | PROCenv_set(env%, FNfirst(binds%), FNfirst(exprs%)) |
12 | binds% = FNrest(binds%) : exprs% = FNrest(exprs%) | |
0e159177 | 13 | ENDIF |
1204264c BH |
14 | ENDWHILE |
15 | =env% | |
16 | ||
dbe45187 BH |
17 | DEF PROCenv_set(env%, keysym%, val%) |
18 | LOCAL data% | |
19 | data% = FNenvironment_data(env%) | |
c592ecd1 | 20 | data% = FNhashmap_set(data%, FNunbox_symbol(keysym%), val%) |
dbe45187 BH |
21 | PROCenvironment_set_data(env%, data%) |
22 | ENDPROC | |
23 | ||
24 | DEF FNenv_find(env%, keysym%) | |
977bf5dd BH |
25 | LOCAL val%, outer%, key$ |
26 | key$ = FNunbox_symbol(keysym%) | |
0d91efff BH |
27 | WHILE NOT FNis_nil(env%) |
28 | IF FNhashmap_contains(FNenvironment_data(env%), key$) THEN =env% | |
29 | env% = FNenvironment_outer(env%) | |
30 | ENDWHILE | |
31 | =FNnil | |
dbe45187 BH |
32 | |
33 | DEF FNenv_get(env%, keysym%) | |
f138a315 | 34 | LOCAL key$ |
dbe45187 | 35 | env% = FNenv_find(env%, keysym%) |
f138a315 | 36 | key$ = FNunbox_symbol(keysym%) |
9bb18e99 | 37 | IF FNis_nil(env%) THEN ERROR &40E80922, "'"+key$+"' not found" |
f138a315 | 38 | =FNhashmap_get(FNenvironment_data(env%), key$) |
dd3d5ad7 BH |
39 | |
40 | REM Local Variables: | |
41 | REM indent-tabs-mode: nil | |
42 | REM End: |