类型推导过于复杂,已经到了无法Step In/Over的地步了,于是只好靠输出大量调试信息来解决问题。这里给出了我为Kernel FP开发的一些简单的调试用宏。在不需要调试信息的时候,可以通过简单关闭调试而将产生调试信息的运行时负担完全去除。
这里是宏的代码:
1 /*******************************************************************************
2 Vczh Library++ 2.0
3 Kernel FP::调试库
4 开发者:陈梓瀚
5
6 类:
7 函数:
8 *******************************************************************************/
9 #ifndef VL_KFPPRIVATEDEBUGLIBRARY
10 #define VL_KFPPRIVATEDEBUGLIBRARY
11
12 #define ENABLE_KFP_DEBUG_MODE
13
14 #ifdef ENABLE_KFP_DEBUG_MODE
15
16 #define Debug_IncreaseLevel() Info.DebugInfo.IncreaseLevel()
17 #define Debug_DecreaseLevel() Info.DebugInfo.DecreaseLevel()
18 #define Debug_AppendSeparator() Info.DebugInfo.AppendSeparator()
19 #define Debug_AppendMessage(Message) Info.DebugInfo.AppendMessage(Message)
20
21 #else
22
23 #define Debug_IncreaseLevel()
24 #define Debug_DecreaseLevel()
25 #define Debug_AppendSeparator()
26 #define Debug_AppendMessage(Message)
27
28 #endif
29
30 #endif
于是编译器通过阅读代码输出两个文件,一个是推导结果,另一个是推导过程中产生的调试信息:
1 【模块:system】
2 module system::system
3 type bool
4 type char
5 type int
6 type list T
7 type void
8 ctor empty :: type list T
9 ctor false :: type bool
10 ctor list :: <T> -> (system.list <T>) -> type list T
11 ctor true :: type bool
12 func chr :: (system.int -> system.char) alias chr codefrom -1
13 func iadd :: (system.int -> (system.int -> system.int)) alias iadd codefrom -1
14 func idiv :: (system.int -> (system.int -> system.int)) alias idiv codefrom -1
15 func iequ :: (system.int -> (system.int -> system.bool)) alias iequ codefrom -1
16 func ilg :: (system.int -> (system.int -> system.bool)) alias ilg codefrom -1
17 func imod :: (system.int -> (system.int -> system.int)) alias imod codefrom -1
18 func imul :: (system.int -> (system.int -> system.int)) alias imul codefrom -1
19 func ism :: (system.int -> (system.int -> system.bool)) alias ism codefrom -1
20 func isub :: (system.int -> (system.int -> system.int)) alias isub codefrom -1
21 func ord :: (system.char -> system.int) alias ord codefrom -1
22 【模块:sysutils】
23 module sysutils::sysutils
24 import system
25 type pair T1 T2
26 ctor pair :: <T1> -> <T2> -> type pair T1 T2
27 func and :: (system.bool -> (system.bool -> system.bool)) codefrom 4
28 func if T1 :: (system.bool -> (<T1> -> (<T1> -> <T1>))) codefrom 9
29 func ineg :: (system.int -> system.int) codefrom 11
30 func not :: (system.bool -> system.bool) codefrom 2
31 func or :: (system.bool -> (system.bool -> system.bool)) codefrom 6
32 func pairop T1 T2 T3 :: ((<T1> -> (<T2> -> <T3>)) -> ((sysutils.pair <T1> <T2>) -> <T3>)) codefrom 12
33 func xor :: (system.bool -> (system.bool -> system.bool)) codefrom 8
34 【模块:sysutils.1】
35 module sysutils::sysutils.1
36 import sysutils
37 name a
38 【模块:sysutils.2】
39 module sysutils::sysutils.2
40 import sysutils
41 name a
42 name b
43 【模块:sysutils.3】
44 module sysutils::sysutils.3
45 import sysutils
46 name a
47 name b
48 【模块:sysutils.4】
49 module sysutils::sysutils.4
50 import sysutils
51 name a
52 name b
53 【模块:sysutils.5】
54 module sysutils::sysutils.5
55 import sysutils
56 name cond
57 name f
58 name t
59 【模块:sysutils.5.1】
60 module sysutils::sysutils.5.1
61 import sysutils.5
62 func result T1 :: <T1> codefrom 0
63 【模块:sysutils.6】
64 module sysutils::sysutils.6
65 import sysutils
66 name num
67 【模块:sysutils.7】
68 module sysutils::sysutils.7
69 import sysutils
70 name op
71 【模块:sysutils.7.1】
72 module sysutils::sysutils.7.1
73 import sysutils.7
74 name p
75 【模块:sysutils.7.1.1】
76 module sysutils::sysutils.7.1.1
77 import sysutils.7.1
78 name a
79 name b
这里就是调试信息了。调试信息给出了类型推导的全过程:
1 进行一轮推导,单元名"system"
2 *********************************************
3 进行一轮推导,单元名"sysutils"
4 开始推导函数"sysutils::and"。
5 期望类型:(system.bool -> (system.bool -> system.bool))。
6 假定参数"b"的类型:system.bool。
7 假定参数"a"的类型:system.bool。
8 假定结果的类型:system.bool。
9 <VL_KfpCodeSelectExpression> 推导表达式:
10 select a of
11 case true : b
12 case false : false
13 end
14 期望类型:system.bool。
15 <VL_KfpCodePrimitiveExpression> 推导表达式:
16 a
17 期望类型:空。
18 类型[1]:system.bool。
19 源:sysutils.2.a。
20 产生类型:system.bool。
21 判断Case匹配表达式类型:true。
22 Case匹配表达式类型:system.bool。
23 融合Case匹配表达式类型:system.bool。
24 判断Case匹配表达式类型:false。
25 Case匹配表达式类型:system.bool。
26 融合Case匹配表达式类型:system.bool。
27 Case分支期望类型:system.bool。
28 <VL_KfpCodePrimitiveExpression> 推导表达式:
29 b
30 期望类型:system.bool。
31 类型[1]:system.bool。
32 源:sysutils.2.b。
33 Case分支期望类型:system.bool。
34 <VL_KfpCodePrimitiveExpression> 推导表达式:
35 false
36 期望类型:system.bool。
37 类型[1]:system.bool。
38 源:system.false。
39 推导结果:system.bool。
40 结果类型:(system.bool -> (system.bool -> system.bool))。
41 *********************************************
42 开始推导函数"sysutils::if"。
43 期望类型:空。
44 假定参数"f"的类型:<$1>。
45 假定参数"t"的类型:<$2>。
46 假定参数"cond"的类型:<$3>。
47 假定结果的类型:<$4>。
48 <VL_KfpCodeLetInExpression> 推导表达式:
49 (let
50 def result =
51 select cond of
52 case true : t
53 case false : f
54 end
55 inresult)
56 期望类型:<$4>。
57 对内部函数进行推导。
58 开始推导函数"sysutils.5.1::result"。
59 期望类型:空。
60 假定结果的类型:空。
61 <VL_KfpCodeSelectExpression> 推导表达式:
62 select cond of
63 case true : t
64 case false : f
65 end
66 期望类型:空。
67 <VL_KfpCodePrimitiveExpression> 推导表达式:
68 cond
69 期望类型:空。
70 类型[1]:<$3>。
71 源:sysutils.5.cond。
72 产生类型:<$3>。
73 判断Case匹配表达式类型:true。
74 Case匹配表达式类型:system.bool。
75 融合Case匹配表达式类型:system.bool。
76 判断Case匹配表达式类型:false。
77 Case匹配表达式类型:system.bool。
78 融合Case匹配表达式类型:system.bool。
79 Case分支期望类型:空。
80 <VL_KfpCodePrimitiveExpression> 推导表达式:
81 t
82 期望类型:空。
83 类型[1]:<$2>。
84 源:sysutils.5.t。
85 产生类型:<$2>。
86 Case分支期望类型:<$2>。
87 <VL_KfpCodePrimitiveExpression> 推导表达式:
88 f
89 期望类型:<$2>。
90 类型[1]:<$1>。
91 源:sysutils.5.f。
92 产生类型:<$2>。
93 推导结果:<$2>。
94 结果类型:<$2>。
95 *********************************************
96 对表达式进行推导。
97 <VL_KfpCodePrimitiveExpression> 推导表达式:
98 result
99 期望类型:<$4>。
100 类型[1]:<$2>。
101 源:sysutils.5.1.result。
102 产生类型:<$4>。
103 结果类型:(system.bool -> (<$4> -> (<$4> -> <$4>)))。
104 *********************************************
105 开始推导函数"sysutils::ineg"。
106 期望类型:(system.int -> system.int)。
107 假定参数"num"的类型:system.int。
108 假定结果的类型:system.int。
109 <VL_KfpCodeInvokeExpression> 推导表达式:
110 ((isub 0) num)
111 期望类型:system.int。
112 <VL_KfpCodePrimitiveExpression> 推导表达式:
113 num
114 期望类型:空。
115 类型[1]:system.int。
116 源:sysutils.6.num。
117 产生类型:system.int。
118 推导的参数类型:system.int。
119 <VL_KfpCodeInvokeExpression> 推导表达式:
120 (isub 0)
121 期望类型:(system.int -> system.int)。
122 <VL_KfpCodePrimitiveExpression> 推导表达式:
123 0
124 期望类型:空。
125 类型[1]:system.int。
126 源:<INTEGER-CONSTANT>。
127 产生类型:system.int。
128 推导的参数类型:system.int。
129 <VL_KfpCodePrimitiveExpression> 推导表达式:
130 isub
131 期望类型:(system.int -> (system.int -> system.int))。
132 类型[1]:(system.int -> (system.int -> system.int))。
133 源:system.isub。
134 推导的函数类型:(system.int -> (system.int -> system.int))。
135 推导结果:(system.int -> system.int)。
136 推导的函数类型:(system.int -> system.int)。
137 推导结果:system.int。
138 结果类型:(system.int -> system.int)。
139 *********************************************
140 开始推导函数"sysutils::not"。
141 期望类型:(system.bool -> system.bool)。
142 假定参数"a"的类型:system.bool。
143 假定结果的类型:system.bool。
144 <VL_KfpCodeSelectExpression> 推导表达式:
145 select a of
146 case true : false
147 case false : true
148 end
149 期望类型:system.bool。
150 <VL_KfpCodePrimitiveExpression> 推导表达式:
151 a
152 期望类型:空。
153 类型[1]:system.bool。
154 源:sysutils.1.a。
155 产生类型:system.bool。
156 判断Case匹配表达式类型:true。
157 Case匹配表达式类型:system.bool。
158 融合Case匹配表达式类型:system.bool。
159 判断Case匹配表达式类型:false。
160 Case匹配表达式类型:system.bool。
161 融合Case匹配表达式类型:system.bool。
162 Case分支期望类型:system.bool。
163 <VL_KfpCodePrimitiveExpression> 推导表达式:
164 false
165 期望类型:system.bool。
166 类型[1]:system.bool。
167 源:system.false。
168 Case分支期望类型:system.bool。
169 <VL_KfpCodePrimitiveExpression> 推导表达式:
170 true
171 期望类型:system.bool。
172 类型[1]:system.bool。
173 源:system.true。
174 推导结果:system.bool。
175 结果类型:(system.bool -> system.bool)。
176 *********************************************
177 开始推导函数"sysutils::or"。
178 期望类型:(system.bool -> (system.bool -> system.bool))。
179 假定参数"b"的类型:system.bool。
180 假定参数"a"的类型:system.bool。
181 假定结果的类型:system.bool。
182 <VL_KfpCodeSelectExpression> 推导表达式:
183 select a of
184 case true : true
185 case false : b
186 end
187 期望类型:system.bool。
188 <VL_KfpCodePrimitiveExpression> 推导表达式:
189 a
190 期望类型:空。
191 类型[1]:system.bool。
192 源:sysutils.3.a。
193 产生类型:system.bool。
194 判断Case匹配表达式类型:true。
195 Case匹配表达式类型:system.bool。
196 融合Case匹配表达式类型:system.bool。
197 判断Case匹配表达式类型:false。
198 Case匹配表达式类型:system.bool。
199 融合Case匹配表达式类型:system.bool。
200 Case分支期望类型:system.bool。
201 <VL_KfpCodePrimitiveExpression> 推导表达式:
202 true
203 期望类型:system.bool。
204 类型[1]:system.bool。
205 源:system.true。
206 Case分支期望类型:system.bool。
207 <VL_KfpCodePrimitiveExpression> 推导表达式:
208 b
209 期望类型:system.bool。
210 类型[1]:system.bool。
211 源:sysutils.3.b。
212 推导结果:system.bool。
213 结果类型:(system.bool -> (system.bool -> system.bool))。
214 *********************************************
215 开始推导函数"sysutils::pairop"。
216 期望类型:空。
217 假定参数"op"的类型:<$1>。
218 假定结果的类型:<$2>。
219 <VL_KfpCodeLambdaExpression> 推导表达式:
220 (p ->
221 select p of
222 case ((pair a) b) : ((op a) b)
223 end)
224 期望类型:<$2>。
225 融合后的期望类型:(<$3> -> <$4>)。
226 <VL_KfpCodeSelectExpression> 推导表达式:
227 select p of
228 case ((pair a) b) : ((op a) b)
229 end
230 期望类型:<$4>。
231 <VL_KfpCodePrimitiveExpression> 推导表达式:
232 p
233 期望类型:空。
234 类型[1]:<$3>。
235 源:sysutils.7.1.p。
236 产生类型:<$3>。
237 判断Case匹配表达式类型:((pair a) b)。
238 Case匹配表达式类型:(sysutils.pair <$5> <$6>)。
239 融合Case匹配表达式类型:(sysutils.pair <$5> <$6>)。
240 Case分支期望类型:<$4>。
241 <VL_KfpCodeInvokeExpression> 推导表达式:
242 ((op a) b)
243 期望类型:<$4>。
244 <VL_KfpCodePrimitiveExpression> 推导表达式:
245 b
246 期望类型:空。
247 类型[1]:<$6>。
248 源:sysutils.7.1.1.b。
249 产生类型:<$6>。
250 推导的参数类型:<$6>。
251 <VL_KfpCodeInvokeExpression> 推导表达式:
252 (op a)
253 期望类型:(<$6> -> <$4>)。
254 <VL_KfpCodePrimitiveExpression> 推导表达式:
255 a
256 期望类型:空。
257 类型[1]:<$5>。
258 源:sysutils.7.1.1.a。
259 产生类型:<$5>。
260 推导的参数类型:<$5>。
261 <VL_KfpCodePrimitiveExpression> 推导表达式:
262 op
263 期望类型:(<$5> -> (<$6> -> <$4>))。
264 类型[1]:<$1>。
265 源:sysutils.7.op。
266 产生类型:(<$5> -> (<$6> -> <$4>))。
267 推导的函数类型:(<$5> -> (<$6> -> <$4>))。
268 推导结果:(<$6> -> <$4>)。
269 推导的函数类型:(<$6> -> <$4>)。
270 推导结果:<$4>。
271 推导结果:<$4>。
272 推导结果:((sysutils.pair <$5> <$6>) -> <$4>)。
273 结果类型:((<$5> -> (<$6> -> <$4>)) -> ((sysutils.pair <$5> <$6>) -> <$4>))。
274 *********************************************
275 开始推导函数"sysutils::xor"。
276 期望类型:(system.bool -> (system.bool -> system.bool))。
277 假定参数"b"的类型:system.bool。
278 假定参数"a"的类型:system.bool。
279 假定结果的类型:system.bool。
280 <VL_KfpCodeSelectExpression> 推导表达式:
281 select a of
282 case true : (not b)
283 case false : b
284 end
285 期望类型:system.bool。
286 <VL_KfpCodePrimitiveExpression> 推导表达式:
287 a
288 期望类型:空。
289 类型[1]:system.bool。
290 源:sysutils.4.a。
291 产生类型:system.bool。
292 判断Case匹配表达式类型:true。
293 Case匹配表达式类型:system.bool。
294 融合Case匹配表达式类型:system.bool。
295 判断Case匹配表达式类型:false。
296 Case匹配表达式类型:system.bool。
297 融合Case匹配表达式类型:system.bool。
298 Case分支期望类型:system.bool。
299 <VL_KfpCodeInvokeExpression> 推导表达式:
300 (not b)
301 期望类型:system.bool。
302 <VL_KfpCodePrimitiveExpression> 推导表达式:
303 b
304 期望类型:空。
305 类型[1]:system.bool。
306 源:sysutils.4.b。
307 产生类型:system.bool。
308 推导的参数类型:system.bool。
309 <VL_KfpCodePrimitiveExpression> 推导表达式:
310 not
311 期望类型:(system.bool -> system.bool)。
312 找不到符号"not"或该符号不具有可参考的类型信息,无法进行类型推导。
313 推导的函数类型:空。
314 推导失败。
315 Case分支期望类型:system.bool。
316 <VL_KfpCodePrimitiveExpression> 推导表达式:
317 b
318 期望类型:system.bool。
319 类型[1]:system.bool。
320 源:sysutils.4.b。
321 推导结果:system.bool。
322 结果类型:(system.bool -> (system.bool -> system.bool))。
323 *********************************************
324 *********************************************
325 进行一轮推导,单元名"sysutils"
326 开始推导函数"sysutils::if"。
327 期望类型:(system.bool -> (<T1> -> (<T1> -> <T1>)))。
328 假定参数"f"的类型:<$1>。
329 假定参数"t"的类型:<$1>。
330 假定参数"cond"的类型:system.bool。
331 假定结果的类型:<$1>。
332 <VL_KfpCodeLetInExpression> 推导表达式:
333 (let
334 def result =
335 select cond of
336 case true : t
337 case false : f
338 end
339 inresult)
340 期望类型:<$1>。
341 对内部函数进行推导。
342 对表达式进行推导。
343 <VL_KfpCodePrimitiveExpression> 推导表达式:
344 result
345 期望类型:<$1>。
346 类型[1]:<T1>。
347 源:sysutils.5.1.result。
348 产生类型:<$1>。
349 结果类型:(system.bool -> (<$1> -> (<$1> -> <$1>)))。
350 *********************************************
351 *********************************************
posted on 2008-10-29 10:04
陈梓瀚(vczh) 阅读(2244)
评论(3) 编辑 收藏 引用 所属分类:
脚本技术