14 # builtin function with meta %
15 # user defined function $
17 function types_allocate
()
19 types_heap
[types_heap_index
]["ref"] =
1
20 return types_heap_index
++
23 function types_addref
(ast
)
25 if (ast ~
/^
[([{$
%?]/) {
26 ++types_heap
[substr(ast
, 2)]["ref"]
31 function types_release
(ast
, idx
, ref
, i
, len
)
36 ref =
--types_heap
[idx
]["ref"]
39 print "ref count error:" ast
", " ref
41 len = types_heap
[idx
]["len"]
42 for (i =
0; i
< len
; ++i
) {
43 types_release
(types_heap
[idx
][i
])
45 types_release
(types_heap
[idx
]["meta"])
46 delete types_heap
[idx
]
51 ref =
--types_heap
[idx
]["ref"]
54 print "ref count error:" ast
", " ref
56 for (i in types_heap
[idx
]) {
58 types_release(types_heap[idx][i])
61 types_release(types_heap[idx]["meta
"])
62 delete types_heap[idx]
67 ref = --types_heap[idx]["ref
"]
70 print "ref count error
:" ast ", " ref
72 types_release(types_heap[idx]["params
"])
73 types_release(types_heap[idx]["body
"])
74 types_release(types_heap[idx]["meta
"])
75 env_release(types_heap[idx]["env
"])
76 delete types_heap[idx]
81 ref = --types_heap[idx]["ref
"]
84 print "ref count error
:" ast ", " ref
86 types_release(types_heap[idx]["meta
"])
87 delete types_heap[idx]
92 ref = --types_heap[idx]["ref
"]
95 print "ref count error
:" ast ", " ref
97 types_release(types_heap[idx]["obj
"])
98 delete types_heap[idx]
103 function types_check(val, idx, len, i)
105 if (val !~ /^[([{?%$]/) {
109 if (!(idx in types_heap)) {
110 print "dangling reference
" val
113 if (types_heap[idx]["checked
"]++) {
116 #types_heap[idx]["checked
"] = 1
119 if (!("len
" in types_heap[idx])) {
120 print "length not found in
" val
123 len = types_heap[idx]["len
"]
124 for (i = 0; i < len; ++i) {
125 if (!(i in types_heap[idx])) {
126 print "sequence corrupted in
" val " of
" i
128 types_check(types_heap[idx][i])
131 types_check(types_heap[idx]["meta
"])
134 for (i in types_heap[idx]) {
136 types_check(types_heap[idx][i])
141 if (!("obj
" in types_heap[idx])) {
142 print "atom corrupted in
" val
144 types_check(types_heap[idx]["obj
"])
146 types_check(types_heap[idx]["meta
"])
149 if (!("func
" in types_heap[idx])) {
150 print "function corrupted in
" val
152 types_check(types_heap[idx]["func
"])
154 types_check(types_heap[idx]["meta
"])
157 if (!("body
" in types_heap[idx])) {
158 print "function body corrupted in
" val
160 types_check(types_heap[idx]["body
"])
162 if (!("params
" in types_heap[idx])) {
163 print "function params corrupted in
" val
165 types_check(types_heap[idx]["params
"])
167 if (!("env
" in types_heap[idx])) {
168 print "function env corrupted in
" val
170 env_check(types_heap[idx]["env
"])
172 types_check(types_heap[idx]["meta
"])
175 print "unknown type
" val
180 function types_dump(i, j)
182 for (i = 0; i < types_heap_index; i++) {
183 if (i in types_heap) {
184 if (isarray(types_heap[i])) {
185 if (!("checked
" in types_heap[i]) || types_heap[i]["checked
"] != types_heap[i]["ref
"]) {
186 for (j in types_heap[i]) {
187 print " types_heap
[" i "][" j "] =
" types_heap[i][j]
191 print " types_heap
[" i "] =
" types_heap[i]
197 function types_typename(str)
200 case /^"/: return "string"
201 case
/^
'/: return "symbol"
202 case /^:/: return "keyword"
203 case /^\+/: return "number"
204 case /^#nil$/: return "nil"
205 case /^#true$/: return "true"
206 case /^#false$/: return "false"
207 case /^\(/: return "list"
208 case /^\[/: return "vector"
209 case /^\{/: return "hash"
210 case /^\?/: return "atom"
211 case /^[&%]/: return "builtin function"
212 case /^\$/: return "user defined function"