scheme直譯器如何避免遞迴?

時間 2021-05-05 17:28:17

1樓:

你知道Continuation嗎?如果沒有,就讀讀EoPL3的第五章,這對於Schemer而言是常識。而且,因為EoPL講述的是一般的原理,其實它也應該成為任何乙個程式設計師的常識。

2樓:Belleve

這不就是 TCO 麼……

如果你做 CEK 式直譯器的話,Tail Call 有乙個極其明顯的特徵,就是它的 K 一定是某個呼叫幀的 Returning Continuation,你可以直接彈棧再壓新的進去……

3樓:BSD依依鴨

我部落格裡面有說到(http://

evilbinary.org/blog/article/19/

) ,可以參考我得開源lisp-直譯器(https://github.com/evilbinary/lisp對於普通函式,邏輯上可以修改成迴圈方式,可以消除遞迴上的困擾。

一定要使用遞迴的,可以修改成尾遞迴,或許編譯器可以幫你優化,大部分編譯器可以做到。

對於二叉樹型別的遞迴,因為乙個要呼叫left、right兩個分支,而這個有點棘手,我採用的方法是消除其中乙個,把它修改成goto方式,這樣可以避免溢位。

還有一種方法,彈跳床技術,好像很多lisp實現用了這個方法,它就是在尾遞迴的基礎上做的,把尾遞迴改稱迴圈。

4樓:

scheme的語法至少是context-free。解析context-free文法需要下推自動機,粗略說就是自動機帶了個棧。

做parsing怎麼也逃不過棧的,某種意義上也就逃不過遞迴

5樓:

先把直譯器進行CPS變換,這樣所有non-trival呼叫都是尾呼叫

然而現有Python的實現並不能優化尾呼叫,這時候再用Trampolining技巧

詳見於EOPL第五章

6樓:zanxas

好吧。渣渣python

python的遞迴不友好:

次數限制1000次,很容易溢位。

沒有尾遞迴優化。(寫了尾遞迴還是炸)

遞迴可以用迴圈來實現。

7樓:楊雙成

題主應該問,為什麼有的語言函式呼叫很便宜,所以只有遞迴,沒有迭代,而有的語言函式呼叫很昂貴,所以不鼓勵遞迴。以這個標準,極其片面的看法是Python就是連函式呼叫都處理不好的渣渣。逃。。。

8樓:

呃,寫過簡單版scheme編譯器,想避免遞迴當然有辦法,手動模擬乙個棧就行了。但這並不是編譯器的point。而且題主你那個叫直譯器

題主還需要學習一下資料結構啊

如何避免 web font 在瀏覽器中的鋸齒現象,製作字型時有沒有什麼方法可以優化字型的細節?

齊凡 每種瀏覽器對web font檔案都有各自的喜好,IE對.eot支援得比較好,一般不會有鋸齒,Firefox對.woff支援得比較好,效果堪稱完美。chrome對.svg支援得比較好,一般不會有鋸齒,同時chrome也支援.woff,不過對.woff支援得比較差。一般產生鋸齒的情況都出在以chr...

如何解釋 長時間在家就不可避免的發生和家長吵架 這件事?

魚不枝 我乙個三分鐘可以惹毛我媽的人也不知道怎麼去解釋 但是我媽語重心長的給我說過,她覺得她是更年期到了,難免嘮嘮叨叨然後控制不住情緒,才會放大一些小事,從而讓我覺得不舒服,然後再和她吵架。 張小茶 動物長大了都被趕出家門,何況人?小時候看你可愛,又弱了吧唧的,父母比較有保護欲。你現在一大把年紀了,...

如何向孩子解釋遙控器是怎麼開啟風扇讓風扇動起來的

林梓 我家兒子兩歲半,也問過。他問電動百葉窗是怎麼回事。我是這麼跟他說的,遙控器在對百葉窗上面的小電機說話,你一按,遙控器說,你往這邊轉,百葉窗關上了。他說的話我們聽不見,但是電動機能聽見。 餃餃育兒 得看幾歲孩子問你啊 12歲以後,查點專業資料,資料怎麼講給孩子基本也可以怎麼講,有具體材料更好,沒...