「關於編譯器的一些想法」修訂間的差異
跳至導覽
跳至搜尋
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) |
||
行 87: | 行 87: | ||
``` | ``` | ||
ThunkAnony8964 thunkanony8964(TypeOfX x ,TypeFreeVars env){ | |||
foo(x, env[free_vars]); | foo(x, env[free_vars]); | ||
} | } | ||
行 93: | 行 93: | ||
struct ClosureTypei1r1 { | struct ClosureTypei1r1 { | ||
TypeFreeVars env, # 可以用鏈表 | TypeFreeVars env, # 可以用鏈表 | ||
* | *ThunkAnony8964 thunk, | ||
}; | }; | ||
ClosureTypei1r1 | ClosureTypei1r1 anony8964; | ||
TypeFreeVars env = free_vars; | TypeFreeVars env = free_vars; | ||
anony8964.env = env; | |||
anony8964.thunk = *thunkanony8964; | |||
``` | ``` | ||
行 111: | 行 111: | ||
改為 | 改為 | ||
``` | ``` | ||
anony9864.thunk(n, anony8964.env); | |||
``` | ``` | ||
[[category:資訊]] | [[category:資訊]] |
於 2022年1月16日 (日) 23:48 的修訂
迴圈
for 到 while
可以轉換成
迴圈如何變成尾遞迴
其中 $bodyExp_n$ 可以為下列之一:
- 當然還有部分調用、全部調用
可以分析 有哪些?有哪些?
設, 則
while 迴圈就可以變成新的遞迴函數 ,如下:
對字串的思考
字串是什麼? →其實可以表示為很大的數字。 所以,要用鏈表表示也是可行的。
閉包
``` (x)=>{foo(x, free_vars)} ``` 轉換 ``` ThunkAnony8964 thunkanony8964(TypeOfX x ,TypeFreeVars env){
foo(x, env[free_vars]);
} struct ClosureTypei1r1 { TypeFreeVars env, # 可以用鏈表 *ThunkAnony8964 thunk, }; ClosureTypei1r1 anony8964; TypeFreeVars env = free_vars; anony8964.env = env; anony8964.thunk = *thunkanony8964; ``` 調用
```
lambda(x){body}(n);
``` 改為
``` anony9864.thunk(n, anony8964.env); ```