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

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
行 37: 行 37:
===迴圈如何變成尾遞迴===
===迴圈如何變成尾遞迴===


$$while(condFunction(x~[,y,...]))\{\newline
<math>
bodyExp_1[, bodyExp_2,...]\newline
\begin{align}
\}
& while(condFunction(x~[,y,...]))\{\\
$$
& bodyExp_1[, bodyExp_2,...]\\
& \}\\
\end{align}
</math>


其中 $bodyExp_n$ 可以為下列之一:
其中 $bodyExp_n$ 可以為下列之一:


- $oldVar_j := f(calledVar_1, [calledVar_2,...])$
* <math>oldVar_j := f(calledVar_1, [calledVar_2,...])</math>
-  $newVar_j = f(calledVar_1, [calledVar_2,...])$
* <math>newVar_j = f(calledVar_1, [calledVar_2,...])</math>
- $f(expression_i)$ 當然還有部分調用、全部調用
* <math>f(expression_i)</math> 當然還有部分調用、全部調用
- $isolatedVar$
* <math>isolatedVar</math>
- $consonant$
* <math>consonant</math>


可以分析 $oldVar_j$ 有哪些?$newVar_j$有哪些?
可以分析 <math>oldVar_j</math> 有哪些?<math>newVar_j</math>有哪些?


$oldVarSet = \{oldVar_i|i = 1,2,...,n\}$$calledVarSet = \{calledVar_i|i = 1,2,...,n\}$
<math>oldVarSet = \{oldVar_i|i = 1,2,...,n\}</math><math>calledVarSet = \{calledVar_i|i = 1,2,...,n\}</math>


$iteratedVarSet = oldVarSet\cap calledVarSet$
<math>iteratedVarSet = oldVarSet\cap calledVarSet</math>


while 迴圈就可以變成新的遞迴函數 $recFunc$,如下:
while 迴圈就可以變成新的遞迴函數 <math>recFunc</math>,如下:


  $recFunc(all~x~from~iteratedVarSet)\{\newline
  <math>& recFunc(all~x~from~iteratedVarSet)\{\\
if(condFunction)\{\newline
& if(condFunction)\{\\</math>
newBodyExp_i\newline
& newBodyExp_i\\
return~~recFunc(...)\newline
& return~~recFunc(...)\\
\}
& \}
  \}$
  \}</math>
   
   
==對字串的思考==
==對字串的思考==

於 2022年1月11日 (二) 19:36 的修訂

迴圈

for 到 while

可以轉換成


迴圈如何變成尾遞迴

其中 $bodyExp_n$ 可以為下列之一:

  • 當然還有部分調用、全部調用

可以分析 有哪些?有哪些?

while 迴圈就可以變成新的遞迴函數 ,如下:

解析失敗 (語法錯誤): {\displaystyle & recFunc(all~x~from~iteratedVarSet)\{\\ & if(condFunction)\{\\}

& newBodyExp_i\\ & return~~recFunc(...)\\ & \}

\}</math>

對字串的思考

字串是什麼? →其實可以表示為很大的數字。

所以,要用鏈表表示也是可行的。


閉包

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