跳轉到內容

Rebol 程式設計/語言特性/遞迴

來自華夏公益教科書,開放的書籍,開放的世界

Rebol 允許遞迴程式設計。當函式能夠呼叫自身時,這非常有用,例如遍歷樹形結構,比如爬取網站。但是,如果函式被呼叫的次數過多,就會發生堆疊錯誤。最好將遞迴函式的應用限制在遞迴次數已知的範圍內。

然而,應該注意的是,Rebol 直譯器以遞迴的方式評估 Rebol 程式碼。

例如,下面定義一個遞迴函式 **read-dir**,用於從給定目錄中收集檔案和目錄名稱,以及該目錄下所有子目錄。

file-list: []
read-dir: func [ 
   dir [file!]
][
   foreach file read dir [
       file: either dir = %./ [file][dir/:file]
       append file-list file
           if dir? file [
           	read-dir file
           ]
    ]
]
read-dir %./
new-line/all file-list on
print mold file-list

從一個空的檔案列表塊開始,函式 read-dir 讀取當前目錄中的所有檔案。如果檔案是一個目錄,它將呼叫自身讀取該目錄,並在完成時返回到呼叫它的自身版本。

人們經常問 Rebol 是否支援尾遞迴延續。答案是,它曾經這樣做,但它被刪除了,因為它會導致 Rebol 消耗大量的記憶體。 Carl Sassenrath,Rebol 的首席架構師,表示在某個階段可能會重新實現 **尾遞迴**,但這並不優先。然而,尾遞迴將解決解析方言中有時遇到的堆疊溢位問題,並允許深度遞迴函式。

  • wikichanges.r 一個爬取 Rebol 程式設計華夏公益教科書以檢視最新更改的示例
華夏公益教科書