1 function env_new
(outer
, params
, args
, idx
, len
, i
, j
, lst
, param
)
4 params =
substr(params
, 2)
5 len = types_heap
[params
]["len"]
6 if (len
>=
2 && types_heap
[params
][len
- 2] ==
"'&") {
7 if (types_heap
[args
]["len"] < len
- 1) {
8 return "!\"Invalid argument length for the function. Expects at least " (len
- 2) " arguments, supplied " (types_heap
[args
]["len"] - 1) "."
11 if (types_heap
[args
]["len"] != len
+ 1) {
12 return "!\"Invalid argument length for the function. Expects exactly " len
" arguments, supplied " (types_heap
[args
]["len"] - 1) "."
16 env_heap
[env_heap_index
]["ref"] =
1
17 env_heap
[env_heap_index
]["outer"] = outer
19 for (i =
0; i
< len
; ++i
) {
20 param = types_heap
[params
][i
]
22 idx = types_allocate
()
23 env_set
(env_heap_index
, types_heap
[params
][++i
], "(" idx
)
24 len = types_heap
[args
]["len"]
25 for (j =
0; i
< len
; ++j
) {
26 types_addref
(types_heap
[idx
][j
] = types_heap
[args
][i
++])
28 types_heap
[idx
]["len"] = j
31 env_set
(env_heap_index
, param
, types_heap
[args
][i
+ 1])
32 types_addref
(types_heap
[args
][i
+ 1])
38 return env_heap_index
++
41 function env_set
(env
, key
, val
)
43 if (key in env_heap
[env
]) {
44 types_release
(env_heap
[env
][key
])
47 env_builtinnames
[substr(val
, 2)] =
substr(key
, 2)
49 env_heap
[env
][key
] = val
52 function env_find
(env
, key
)
55 if (key in env_heap
[env
]) {
58 env = env_heap
[env
]["outer"]
63 function env_get
(env
, key
)
65 env = env_find
(env
, key
)
67 return env_heap
[env
][key
]
69 return "!\"'" substr(key
, 2) "' not found"
72 function env_addref
(env
)
74 env_heap
[env
]["ref"]++
77 function env_release
(env
, i
, outer
)
79 while (env
!= "" && --env_heap
[env
]["ref"] ==
0) {
80 for (i in env_heap
[env
]) {
82 types_release(env_heap[env][i])
85 outer = env_heap[env]["outer"]
91 function env_dump(i, j)
93 for (i = 0; i < env_heap_index; i++) {
95 if (isarray(env_heap[i])) {
96 if (!("checked" in env_heap[i]) || env_heap[i]["checked"] != env_heap[i]["ref"]) {
97 for (j in env_heap[i]) {
98 print " env_heap[" i "][" j "] = " env_heap[i][j]
102 print " env_heap[" i "] = " env_heap[i]
108 function env_check(env, i, outer)
110 if (env_heap[env]["checked"]++) {
113 for (i in env_heap[env]) {
114 if (i != "ref" && i != "outer") {
115 types_check(env_heap[env][i])
118 outer = env_heap[env]["outer"]
119 if (outer in env_heap) {