類型推導過于復雜,已經到了無法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) 閱讀(2257)
評論(3) 編輯 收藏 引用 所屬分類:
腳本技術