「關於編譯器的一些想法」修訂間的差異

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
(建立內容為「==迴圈== ===for 到 while=== $for(idVar = initValue;~~cond(idVar); ~~idVar:=updateIdVar(i))\{\ \newline ~~~~body...\newline\}$ 可以轉換成 $idVar = init…」的新頁面)
 
行 3: 行 3:
===for 到 while===
===for 到 while===


$for(idVar = initValue;~~cond(idVar); ~~idVar:=updateIdVar(i))\{\ \newline [[使用者:Tankianting|Tankianting]]([[使用者討論:Tankianting|討論]]) 2022年1月11日 (二) 12:47 (CST)body...\newline\}$
 
 
<math>for(idVar = initValue;~~cond(idVar); ~~idVar:=updateIdVar(i))\{
body...
\}</math>


可以轉換成
可以轉換成


$idVar = initValue \newline while(cond(i))\{\ \newline [[使用者:Tankianting|Tankianting]]([[使用者討論:Tankianting|討論]]) 2022年1月11日 (二) 12:47 (CST)body...\newline[[使用者:Tankianting|Tankianting]]([[使用者討論:Tankianting|討論]]) 2022年1月11日 (二) 12:47 (CST)idVar:=updateIdVar(i)\newline\}$
<math>idVar = initValue \newline while(cond(i))\{\  
 
 
body...
 
idVar:=updateIdVar(i)
 
\}</math>





於 2022年1月11日 (二) 12:52 的修訂

迴圈

for 到 while

可以轉換成

解析失敗 (不明函數 "\newline"): {\displaystyle idVar = initValue \newline while(cond(i))\{\ body... idVar:=updateIdVar(i) \}}


迴圈如何變成尾遞迴

$$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);
```