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%) | |
0e159177 BH |
7 | IF FNunbox_symbol(FNlist_car(binds%)) = "&" THEN |
8 | PROCenv_set(env%, FNlist_nth(binds%, 1), exprs%) | |
9 | binds% = FNempty | |
10 | ELSE | |
11 | PROCenv_set(env%, FNlist_car(binds%), FNlist_car(exprs%)) | |
12 | binds% = FNlist_cdr(binds%) : exprs% = FNlist_cdr(exprs%) | |
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%) | |
20 | data% = FNalloc_hashmap_entry(FNunbox_symbol(keysym%), val%, data%) | |
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%) | |
27 | IF FNhashmap_contains(FNenvironment_data(env%), key$) THEN =env% | |
dbe45187 | 28 | outer% = FNenvironment_outer(env%) |
f138a315 | 29 | IF FNis_nil(outer%) THEN =FNnil |
977bf5dd | 30 | =FNenv_find(outer%, keysym%) |
dbe45187 BH |
31 | |
32 | DEF FNenv_get(env%, keysym%) | |
f138a315 | 33 | LOCAL key$ |
dbe45187 | 34 | env% = FNenv_find(env%, keysym%) |
f138a315 | 35 | key$ = FNunbox_symbol(keysym%) |
9bb18e99 | 36 | IF FNis_nil(env%) THEN ERROR &40E80922, "'"+key$+"' not found" |
f138a315 | 37 | =FNhashmap_get(FNenvironment_data(env%), key$) |
dd3d5ad7 BH |
38 | |
39 | REM Local Variables: | |
40 | REM indent-tabs-mode: nil | |
41 | REM End: |