bbc-basic: Add minimal support for keywords (deferred from step 1).
[jackhill/mal.git] / bbc-basic / env
CommitLineData
49c172c0 1REM > env library for mal in BBC BASIC
dbe45187 2
1204264c
BH
3DEF 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
17DEF 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%)
22ENDPROC
23
24DEF 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
32DEF 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
39REM Local Variables:
40REM indent-tabs-mode: nil
41REM End: