「關於編譯器的一些想法」修訂間的差異
跳至導覽
跳至搜尋
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) |
||
行 79: | 行 79: | ||
===閉包=== | ===閉包=== | ||
<pre> | |||
(x)=>{foo(x, free_vars)} | (x)=>{foo(x, free_vars)} | ||
</pre> | |||
轉換 | 轉換 | ||
<pre> | |||
ThunkAnony8964 thunkanony8964(TypeOfX x ,TypeFreeVars env){ | ThunkAnony8964 thunkanony8964(TypeOfX x ,TypeFreeVars env){ | ||
foo(x, env[free_vars]); | foo(x, env[free_vars]); | ||
行 102: | 行 101: | ||
anony8964.thunk = *thunkanony8964; | anony8964.thunk = *thunkanony8964; | ||
</pre> | |||
執行函數 | |||
<pre> | |||
lambda(x){body}(n); | lambda(x){body}(n); | ||
</pre> | |||
改為 | 改為 | ||
<pre> | |||
anony9864.thunk(n, anony8964.env); | anony9864.thunk(n, anony8964.env); | ||
</pre> | |||
== 如何代碼刪除不須存在的變數或函數? == | == 如何代碼刪除不須存在的變數或函數? == |
於 2022年1月17日 (一) 22:05 的修訂
迴圈
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);
如何代碼刪除不須存在的變數或函數?
- 1. 通常情況且 2.不可變 及 3. 不為外部引用者,只要變(函)數不出現在作用域的任何獨立表達式(須化簡)和定義式的右手邊(須化簡),則可以刪掉。