檢視 關於編譯器的一些想法 的原始碼
←
關於編譯器的一些想法
跳至導覽
跳至搜尋
由於下列原因,您沒有權限進行編輯此頁面的動作:
您請求的操作只有這個群組的使用者能使用:
使用者
您可以檢視並複製此頁面的原始碼。
==迴圈== ===for 到 while=== <math> \begin{align} & for(idVar = initValue;~~cond(idVar); ~~idVar:=updateIdVar(i))\{ \\ & body... \\ \} \end{align}</math> 可以轉換成 <math> \begin{align} & idVar = initValue \\ & while(cond(i))\{\ \\ & body... \\ & idVar:=updateIdVar(i) \\ & \}\end{align} </math> ===迴圈如何變成尾遞迴=== <math> \begin{align} & while(condFunction(x~[,y,...]))\{\\ & bodyExp_1[, bodyExp_2,...]\\ & \}\\ \end{align} </math> 其中 $bodyExp_n$ 可以為下列之一: * <math>oldVar_j := f(calledVar_1, [calledVar_2,...])</math> * <math>newVar_j = f(calledVar_1, [calledVar_2,...])</math> * <math>f(expression_i)</math> 當然還有部分調用、全部調用 * <math>isolatedVar</math> * <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> 則 <math>iteratedVarSet = oldVarSet\cap calledVarSet</math> while 迴圈就可以變成新的遞迴函數 <math>recFunc</math>,如下: <math> \begin{align} & recFunc(all~x~from~iteratedVarSet)\{\\ & if(condFunction)\{\\</math> & 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); ```
此頁面使用了以下模板:
模板:Nav
(
檢視原始碼
)
返回到「
關於編譯器的一些想法
」。
導覽選單
個人工具
登入
命名空間
頁面
討論
變體
視圖
閱讀
檢視原始碼
檢視歷史
更多
搜尋
導覽
首頁
愛爾蘭語辭典
近期變更
隨機頁面
有關 MediaWiki 的說明
相關網站
總首頁
Blog
舊 blog
現用 blog 備份
工具
連結至此的頁面
相關變更
特殊頁面
頁面資訊