Rebol 程式設計/語言特性/遞迴
外觀
< 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 程式設計華夏公益教科書以檢視最新更改的示例