2017-10-18 44 views
3

我已经开始阅读Thinking Forth。在这本书中,作者提到了一个三行模块系统,并参考了Forth会议的会议记录。从第14页开始的Here's a PDF containing a description of the module system,(打印132)。这三行Forth模块系统是如何工作的?

下面是如何使用三个定义的词INTERNAL,EXTERNALMODULE的说明。

模块是单词INTERNAL和 MODULE之间的程序的一部分。常量,变量和例程的定义是模块本地的 写在INTERNAL和EXTERNAL之间。在模块外部使用的定义是在外部和模块之间写入的 。 [局部变量 例程]在INTERNAL和EXTERNAL之间定义。 引用它们的例程在EXTERNAL和MODULE之间定义。

而这里的代码本身:

: INTERNAL (--> ADDR) CURRENT @ @ ; 
: EXTERNAL (--> ADDR) HERE ; 
: MODULE(ADDRl ADDR2 -->)PFA LFA ! ; 

我在读这本书的有关如何在一般的写软件的想法,而不是如何在任何特定的实现的第四方案,所以我我不熟悉代码中使用的内置单词,但我对这个模块系统很好奇。有人可以解释它的工作原理吗?

回答

5

我将重新描述说明。模块应该是这样的:

INTERNAL 
    ... code ... 
EXTERNAL 
    ... more code ... 
MODULE 

实现该模块的系统中的代码假定该词典是传统的单向链表。 INTERNAL保存一个指向当前单词的指针,例如在INTERNAL之前。 EXTERNALEXTERNAL之后保存一个指向该单词的指针。 MODULE需要两个指针,并且在EXTERNAL之后修补该单词的链接字段以指向INTERNAL之前的单词。实际上,它使字典跳过INTERNALEXTERNAL之间的所有单词。

这可能不适用于现代Forth,因为文字CURRENT,PFALFA未标准化。而且,HERE可能不是下一个单词标题的正确地址。

+1

在现代的Forth系统中,一种可能的方法是编译成不同的单词列表并相应地改变搜索顺序,如[Ulrich Hoffmann的模块包](https://theforth.net/package/modules/current-view /modules.fs) – fiz