關於編譯器的一些想法
於 2022年1月11日 (二) 12:47 由 Tankianting(討論 | 貢獻) 所做的修訂 (建立內容為「==迴圈== ===for 到 while=== $for(idVar = initValue;~~cond(idVar); ~~idVar:=updateIdVar(i))\{\ \newline ~~~~body...\newline\}$ 可以轉換成 $idVar = init…」的新頁面)
迴圈
for 到 while
$for(idVar = initValue;~~cond(idVar); ~~idVar:=updateIdVar(i))\{\ \newline Tankianting(討論) 2022年1月11日 (二) 12:47 (CST)body...\newline\}$
可以轉換成
$idVar = initValue \newline while(cond(i))\{\ \newline Tankianting(討論) 2022年1月11日 (二) 12:47 (CST)body...\newlineTankianting(討論) 2022年1月11日 (二) 12:47 (CST)idVar:=updateIdVar(i)\newline\}$
迴圈如何變成尾遞迴
$$while(condFunction(x~[,y,...]))\{\newline bodyExp_1[, bodyExp_2,...]\newline \} $$
其中 $bodyExp_n$ 可以為下列之一:
- $oldVar_j := f(calledVar_1, [calledVar_2,...])$ - $newVar_j = f(calledVar_1, [calledVar_2,...])$ - $f(expression_i)$ 當然還有部分調用、全部調用 - $isolatedVar$ - $consonant$
可以分析 $oldVar_j$ 有哪些?$newVar_j$有哪些?
設$oldVarSet = \{oldVar_i|i = 1,2,...,n\}$,$calledVarSet = \{calledVar_i|i = 1,2,...,n\}$ 則
$iteratedVarSet = oldVarSet\cap calledVarSet$
while 迴圈就可以變成新的遞迴函數 $recFunc$,如下:
$recFunc(all~x~from~iteratedVarSet)\{\newline if(condFunction)\{\newline
newBodyExp_i\newline return~~recFunc(...)\newline \}
\}$
對字串的思考
字串是什麼? →其實可以表示為很大的數字。 所以,要用鏈表表示也是可行的。
閉包
``` (x)=>{foo(x, free_vars)} ``` 轉換 ``` ThunkAnnoy8964 thunkannoy8964(TypeOfX x ,TypeFreeVars env){
foo(x, env[free_vars]);
} struct ClosureTypei1r1 { TypeFreeVars env, # 可以用鏈表 *ThunkAnnoy8964 thunk, }; ClosureTypei1r1 annoy8964; TypeFreeVars env = free_vars; annoy8964.env = env; annoy8964.thunk = *thunkannoy8964; ``` 調用
```
lambda(x){body}(n);
``` 改為
``` annoy9864.thunk(n, annoy8964.env); ```