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 编程维基教科书以查看最新更改的示例