2011-09-24 57 views
2

我已經在python和sapid lisp本身中實現了一個小的lisp解釋器(在google代碼中是sapid lisp)。也許它的主要特點是通過異常實現尾部和相互遞歸優化。這裏的實現細節https://sites.google.com/site/sapidlisp/recursion-optimization尋找描述通過異常進行尾遞歸優化的參考

優於標準技術的優點是適用於遞歸解釋器以獲得尾遞歸優化的有限更改。缺點可能是時機。

我發現了一個類似的技術在Python裝飾器(http://code.activestate.com/recipes/474088/)中使用。現在把這個技術放在它的上下文中,我正在尋找描述這種技術的引用,用於lisp或其他解釋語言。任何信息?

+0

這裏提出的技術將飛尾遞歸調用轉換爲明確的while循環。我沒有辦法將它應用於非遞歸尾部調用。出於這個原因,我不確定標籤的變化是否相關。我錯了嗎? –

回答

4

見利的答案。但爲了增加更多的上下文,Baker的Cheney on the M.T.A.技術是一個衆所周知的技巧,用於實現適當的尾遞歸,將C棧用作繼承框架和其他對象的託兒所(如代GC)。這種技術可以讓堆棧增長一段時間,然後每隔一段時間就跳過一次大的跳躍(longjmp,execption,不管),而不是讓堆棧保持較小的狀態。在清除堆棧之前,將所有活的東西拷貝到堆上。

只要您能夠並且願意跟蹤堆棧並將堆棧中的對象從堆棧中複製到堆上,就可以正常工作。 Eli引用的論文(從廣義堆棧檢查繼續)是關於如何將這個技巧應用到「受管理」的平臺,在那裏你不能直接檢查堆棧。

+0

非常感謝你描述貝克的技術和佩蒂約翰在這方面的論文。 –