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

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
行 38: 行 38:


<math>
<math>
\begin{align}
\begin{align}
& while(condFunction(x~[,y,...]))\{\\
& while(condFunction(x~[,y,...]))\{\\
行 61: 行 62:
while 迴圈就可以變成新的遞迴函數 <math>recFunc</math>,如下:
while 迴圈就可以變成新的遞迴函數 <math>recFunc</math>,如下:


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

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

迴圈

for 到 while

可以轉換成


迴圈如何變成尾遞迴

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

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

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

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

解析失敗 (不明函數 "\begin{align}"): {\displaystyle \begin{align} & recFunc(all~x~from~iteratedVarSet)\{\\ & if(condFunction)\{\\} & newBodyExp_i\\ & return~~recFunc(...)\\ & \} & \} \end{align} </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);
```