「關於編譯器的一些想法」修訂間的差異
跳至導覽
跳至搜尋
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) |
||
行 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> | |||
\begin{align} | |||
& recFunc(all~x~from~iteratedVarSet)\{\\ | |||
& if(condFunction)\{\\</math> | & if(condFunction)\{\\</math> | ||
& newBodyExp_i\\ | & newBodyExp_i\\ | ||
& return~~recFunc(...)\\ | & return~~recFunc(...)\\ | ||
& \} | & \} | ||
& \} | |||
\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); ```