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

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
 
(未顯示同一使用者於中間所作的 17 次修訂)
行 1: 行 1:
==迴圈==
{{Nav|程式語言、邏輯學}}
 
==coding:style==
<pre>
Type Felix struct{
Str name,
Int age};
 
Int a = 2 + 2;


===for 到 while===
(Int Int -> Int) add = lmd(x, y) {
if (x == 0){
return y;
}else{
return x + y;
}
};
</pre>


bool a = (20 == (lmd(int x, int y){return x * y;}(12, 6)) + 2);


Felix (Str name, Int age)


<math>
Int a = 2 + 2;


add = l int x ,int y
\begin{align}


for(idVar = initValue;~~cond(idVar); ~~idVar:=updateIdVar(i))\{ \\
==迴圈==


===for 到 while===


body... \\




<math>
\begin{align}
& for(idVar = initValue;~~cond(idVar); ~~idVar:=updateIdVar(i))\{ \\
& body... \\
\}
\}
\end{align}</math>
\end{align}</math>
行 23: 行 43:
<math>
<math>
\begin{align}
\begin{align}
idVar = initValue \\
& idVar = initValue \\


while(cond(i))\{\  \\
& while(cond(i))\{\  \\


body... \\
& body... \\


idVar:=updateIdVar(i) \\
& idVar:=updateIdVar(i) \\


\}\end{align}
& \}\end{align}
</math>
</math>


行 37: 行 57:
===迴圈如何變成尾遞迴===
===迴圈如何變成尾遞迴===


$$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>
 
可以分析 <math>oldVar_j</math> 有哪些?<math>newVar_j</math>有哪些?
 
設<math>oldVarSet = \{oldVar_i|i = 1,2,...,n\}</math>,<math>calledVarSet = \{calledVar_i|i = 1,2,...,n\}</math> 則


可以分析 $oldVar_j$ 有哪些?$newVar_j$有哪些?
<math>iteratedVarSet = oldVarSet\cap calledVarSet</math>


設$oldVarSet = \{oldVar_i|i = 1,2,...,n\}$,$calledVarSet = \{calledVar_i|i = 1,2,...,n\}$ 則
while 迴圈就可以變成新的遞迴函數 <math>recFunc</math>,如下:


$iteratedVarSet = oldVarSet\cap calledVarSet$
<math>


while 迴圈就可以變成新的遞迴函數 $recFunc$,如下:
\begin{align}
 
& recFunc(all~x~from~iteratedVarSet)\{ \\
& if(condFunction)\{ \\
& newBodyExp_i \\
& return~~recFunc(...) \\
& \} \\
& \}
\end{align}
</math>


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


字串是什麼? →其實可以表示為很大的數字。
字串是什麼? →其實可以表示為很大的數字。
所以,要用鏈表表示也是可行的。
   
   
所以,要用鏈表表示也是可行的。
   
   
===閉包===
==閉包==
   
   
```
<pre>
  (x)=>{foo(x, free_vars)}
  (x)=>{foo(x, free_vars)}
```
</pre>
轉換
   
   
```
轉換
   
   
  ThunkAnnoy8964 thunkannoy8964(TypeOfX x ,TypeFreeVars  env){
<pre>
  ThunkAnony8964 thunkanony8964(TypeOfX x ,TypeFreeVars  env){
foo(x, env[free_vars]);
foo(x, env[free_vars]);
  }
  }
行 88: 行 116:
  struct ClosureTypei1r1 {
  struct ClosureTypei1r1 {
  TypeFreeVars env, # 可以用鏈表
  TypeFreeVars env, # 可以用鏈表
  *ThunkAnnoy8964 thunk,
  *ThunkAnony8964 thunk,
  };
  };
   
   
  ClosureTypei1r1 annoy8964;
  ClosureTypei1r1 anony8964;
  TypeFreeVars env = free_vars;
  TypeFreeVars env = free_vars;
   
   
  annoy8964.env = env;
  anony8964.env = env;
  annoy8964.thunk = *thunkannoy8964;
  anony8964.thunk = *thunkanony8964;
   
   
```
</pre>
   
   
調用
執行函數


```
<pre>
  lambda(x){body}(n);
  lambda(x){body}(n);
```
</pre>
 
改為
改為
```
 
  annoy9864.thunk(n, annoy8964.env);
<pre>
```
  anony9864.thunk(n, anony8964.env);
</pre>
 
== 如何代碼刪除不須存在的變數或函數? ==
 
* 通常來說,下列兩個條件均滿足下,只要變(函)數不出現在作用域的任何獨立表達式(須化簡)和定義式的右手邊(須化簡),則可以刪掉:
*# 不可變
*# 不為外部引用
 
[[category:資訊]]

於 2022年2月18日 (五) 06:09 的最新修訂

coding:style

Type Felix struct{
	Str name,
	Int age};

Int a = 2 + 2;

(Int Int -> Int) add = lmd(x, y) {
	if (x == 0){
		return y;
	}else{
		return x + y;
	}
};

bool a = (20 == (lmd(int x, int y){return x * y;}(12, 6)) + 2);

Felix (Str name, Int age)

Int a = 2 + 2;

add = l int x ,int y

迴圈

for 到 while

可以轉換成


迴圈如何變成尾遞迴

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

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

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

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

對字串的思考

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

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

閉包

 (x)=>{foo(x, free_vars)}

轉換

 ThunkAnony8964 thunkanony8964(TypeOfX x ,TypeFreeVars  env){
foo(x, env[free_vars]);
 }
 
 struct ClosureTypei1r1 {
 TypeFreeVars env, # 可以用鏈表
 *ThunkAnony8964 thunk,
 };
 
 ClosureTypei1r1 anony8964;
 TypeFreeVars env = free_vars;
 
 anony8964.env = env;
 anony8964.thunk = *thunkanony8964;
 

執行函數

 lambda(x){body}(n);

改為

 anony9864.thunk(n, anony8964.env);

如何代碼刪除不須存在的變數或函數?

  • 通常來說,下列兩個條件均滿足下,只要變(函)數不出現在作用域的任何獨立表達式(須化簡)和定義式的右手邊(須化簡),則可以刪掉:
    1. 不可變
    2. 不為外部引用