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

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
行 79: 行 79:
===閉包===
===閉包===
   
   
```
<pre>
  (x)=>{foo(x, free_vars)}
  (x)=>{foo(x, free_vars)}
```
</pre>
   
   
  轉換
  轉換
   
   
```
<pre>
  ThunkAnony8964 thunkanony8964(TypeOfX x ,TypeFreeVars  env){
  ThunkAnony8964 thunkanony8964(TypeOfX x ,TypeFreeVars  env){
foo(x, env[free_vars]);
foo(x, env[free_vars]);
行 102: 行 101:
  anony8964.thunk = *thunkanony8964;
  anony8964.thunk = *thunkanony8964;
   
   
```
</pre>
   
   
調用
執行函數


```
<pre>
  lambda(x){body}(n);
  lambda(x){body}(n);
```
</pre>
 
改為
改為
```
 
<pre>
  anony9864.thunk(n, anony8964.env);
  anony9864.thunk(n, anony8964.env);
```
</pre>


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

於 2022年1月17日 (一) 22:05 的修訂

迴圈

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.不可變 及 3. 不為外部引用者,只要變(函)數不出現在作用域的任何獨立表達式(須化簡)和定義式的右手邊(須化簡),則可以刪掉。