7 new_env_index: procedure expose env
. /* new_env_index() */
11 new_env: procedure expose env
. values
. /* new_env(outer_env_idx [, binds, exprs]) */
12 outer_env_idx
= arg(1)
16 env
.idx
.outer
= outer_env_idx
18 if binds \
= "" then do
19 binds_val
= obj_val
(binds
)
20 exprs_val
= obj_val
(exprs
)
21 do i
=1 to words(binds_val
)
22 varname
= obj_val
(word(binds_val
, i
))
23 if varname
== "&" then do
24 rest_args_list
= new_list
(subword(exprs_val
, i
))
25 varname
= obj_val
(word(binds_val
, i
+ 1))
26 x
= env_set
(idx
, varname
, rest_args_list
)
30 x
= env_set
(idx
, varname
, word(exprs_val
, i
))
35 env_set: procedure expose env
. /* env_set(env_idx, key, val) */
39 env
.env_idx
.data
.key
= val
42 env_find: procedure expose env
. /* env_find(env_idx, key) */
45 if env
.env_idx
.data
.key \
= "" then return env_idx
46 if env
.env_idx
.outer
> 0 then return env_find
(env
.env_idx
.outer
, key
)
49 env_get: procedure expose env
. err
/* env_get(env_idx, key) */
52 found_env_idx
= env_find
(env_idx
, key
)
53 if found_env_idx
== 0 then do
54 err
= "'" || key
|| "' not found"
57 return env
.found_env_idx
.data
.key